ndb多对多,检索其中一个关系的列表

2024-04-24 16:26:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这张桌子

class ClubMembership(GCModel):
    member = ndb.KeyProperty(kind='User', required=True)
    club = ndb.KeyProperty(kind='Club', required=True)
    is_active = ndb.BooleanProperty(default=True)
    membership_type = ndb.StringProperty(choices=set(["MEMBER", "TRAINER", "OWNER"]), default="MEMBER",
                                     required=True)

然后在表Club中我得到了这个

class Club(GCModel):
    @property
    def members(self):
        return ClubMembership.query(ndb.AND(ClubMembership.club == self.key,
                                            ClubMembership.membership_type == "MEMBER",
                                            ClubMembership.is_active == True))

我实际上需要的是检索User的列表。我该怎么办?你知道吗

获取这个查询,而不是有一个for循环,用它的键获取每个member?你知道吗

我试图使用ndb.get_multi使用member上的投影,但它不起作用。 像这样的

members= ClubMembership.query(ndb.AND(ClubMembership.club == self.key,
                                            ClubMembership.membership_type == "MEMBER",
                                            ClubMembership.is_active == True),projection=['member']).fetch()
ndb.get_multi(members)

Tags: selftrueistyperequiredclassmembershipactive
2条回答

get_multi在一个键列表上工作,您有一个ClubMembership实例列表。您需要为每一个获取member键:

memberships = ClubMembership.query(...)
member_keys = [m.member for m in memberships]
members = ndb.get_multi(member_keys)

您还应该考虑将成员资格信息存储在用户的实体中。这样,您可以在一个查询中获得所有用户,这要快得多。你知道吗

class Membership(ndb.Model):
  club = ndb.KeyProperty(kind='Club', required=True)
  is_active = ndb.BooleanProperty(default=True)
  membership_type = ndb.StringProperty(
    choices=set(["MEMBER", "TRAINER", "OWNER"]), default="MEMBER", required=True)

class User(ndb.Model):
  memberships = ndb.StructuredProperty(Membership, repeated=True)

class Club(ndb.Model):
  @property
  def members(self):
    membership = Membership(
      User.memberships.club == self.key,
      User.memberships.membership_type == 'MEMBER',
      User.memberships.is_active == True)
    return User.query(User.memberships == membership)

相关问题 更多 >