2012-05-03 1064 views
0

我有兩個模型班級和學生。每個團隊實體都有不止一個用戶實體,我認爲「一對多」是一個合適的模型。我這樣的代碼:如何在不存在引用的情況下使用referenceProperty創建模型的實體?

class Team(db.Model): 
    teamNmae = db.StringProperty(required=True) 
    teamID = db.IntegerProperty(required=True) 
class Users(db.Model): 
    name = db.StringProperty(required=True) 
    reference = db.ReferenceProperty(Team,collection_name=teamMembers) 

按照this document,我需要先創建一個團隊的實體,然後創建它的參考值設置爲這支球隊實體用戶。但是,這裏是問題所在,我想先創建用戶,然後用戶可以創建一個團隊。那麼,當我創建一個沒有團隊存在的用戶時,如何設置參考?

EDIT1

我寫一些簡單的代碼來測試,如果我可以在不創建其參考實體創建一個實體。

_author__ = 'Steven_yang' 
import os 
import webapp2 
from google.appengine.ext import db 
from google.appengine.ext.webapp import template 
defaultStu = [ 
    'qingWANG', 
    'stevenYANG', 
    'jingZHU', 
    'conghuiHE', 
    'lianDUAN', 
    'xinHAO' 
] 
class Students(db.Model): 
    #reference = db.ReferenceProperty(Team,collection_name='teamMember',required=False) 
    name = db.StringProperty(required=True) 
class Team(db.Model): 
    teamName = db.StringProperty(required=True) 
    teamID = db.IntegerProperty(required=True) 
def createStu(): 
    stu_count = Students.all().count(1) 
    if stu_count == 0: 
     for stu in defaultStu: 
      newStu = Students(name = stu) 

      newStu.put() 
class testReferenceHandler(webapp2.RequestHandler): 
    def get(self): 
     createStu() 
     self.render_page() 
    def render_page(self): 
     stus = Students.all().fetch(10) 
     templateValues={} 
     templateValues['stus'] = stus 
     form = os.path.join(os.path.dirname(__file__),'template/testref.html') 
     renderForm = template.render(form,templateValues) 
     self.response.out.write(renderForm) 
app = webapp2.WSGIApplication([('/testref',testReferenceHandler)],debug=True) 

HTML文件是:

<body> 
    {% for s in stus%} 
    <div>{{s.name}}</div> 
    {% endfor%} 
</body> 
</html> 

當我註釋掉的ReferenceProperty線,一切都很好。當我添加ReferenceProperty行時,我得到一個服務器錯誤。所以,我不能創建一個實體沒有之前創建的參考?

+0

您確定需要一對多的關係嗎?用戶只能是一個團隊嗎?如果是這樣,什麼停止創建空的參考? –

+0

是的,每個用戶只能加入一個團隊,但一個團隊擁有多個用戶。你的意思是當我創建用戶時,我設置了reference = None?我嘗試這個,但它不適合我。 – hakunami

回答

0

在創建User實例時,是否嘗試將reference設置爲Team型號爲None

也改變了最後一行的代碼片段:

reference = db.ReferenceProperty(Team,required=False) 

即添加required=False。這是this answer中建議的內容。

+0

我添加required = False,然後創建newUser = Users(reference = None,....)。但它不起作用。 :( – hakunami

+0

@stevenyang嘗試不傳遞任何東西(即不是'None'),只是不通過'reference'參數。如果這樣做不行,請刪除'collection_name = teamMembers'。 –

+0

對不起,但它仍然不會't work。 – hakunami

相關問題