ndb中的多对多关系

chr*_*isw 8 python google-app-engine many-to-many app-engine-ndb

尝试使用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()
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?我好好看看,但似乎无法找到关于这个主题的任何好文件.

在数据存储区查看器中,我可以看到这种关系存储为密钥列表,我希望如此.

但是,当我尝试在Person类方法中使用它们时,如下所示:

for guild in self.guilds:
Run Code Online (Sandbox Code Playgroud)

我明白了:

TypeError: 'KeyProperty' object is not iterable
Run Code Online (Sandbox Code Playgroud)

Her*_*sta 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()
Run Code Online (Sandbox Code Playgroud)

或者反之:

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()
Run Code Online (Sandbox Code Playgroud)

关系的方向取决于许多因素(您的商业模式,每个人的行会数量,每个行会的成员数量等)