ndb中的多对多关系

8 投票
1 回答
1925 浏览
提问于 2025-04-18 10:55

我正在尝试用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

1 个回答

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()

关系的方向取决于很多因素,比如你的商业模型、每个人有多少个公会、每个公会有多少个成员等等。

撰写回答