2012-05-03 1085 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

相关问题