尝试使用ndb建模多对多关系。任何人都可以指出如何做到这一点的好例子吗?
这是我目前所拥有的一个例子:
class Person(ndb.Model):
guilds = ndb.KeyProperty(kind="Guild", repeated=True)
class Guild(ndb.Model)
members = ndb.KeyProperty(kind="Person", repeated=True)
def add_person(self, person):
self.members.append(person.key)
self.put()
person.guilds.append(self.key)
person.put()
这是正确的方法吗?我已经好好看看了,但似乎无法找到关于这个主题的任何好的文档。
在数据存储区查看器中,我可以看到这种关系存储为键列表,我希望如此。
但是,当我尝试在Person类方法中使用它们时,这样:
for guild in self.guilds:
我明白了:
TypeError: 'KeyProperty' object is not iterable
答案 0 :(得分:14)
没有。这不是正确的方法。
您可以只使用一个重复属性来建模多对多关系:
class Person(ndb.Model):
guilds = ndb.KeyProperty(kind="Guild", repeated=True)
class Guild(ndb.Model):
@property
def members(self):
return Person.query().filter(Person.guilds == self.key)
def add_person(self, person):
person.guilds.append(self.key)
person.put()
或反之亦然:
class Person(ndb.Model):
@property
def guilds(self):
return Guild.query().filter(Guild.members == self.key)
class Guild(ndb.Model):
members = ndb.KeyProperty(kind="Person", repeated=True)
def add_person(self, person):
self.members.append(person.key)
self.put()
关系的方向取决于很多因素(你的商业模式,每个人的行会数,每个行会的成员数等)