ndb many to many, retrieve list of one of the relation

为君一笑 提交于 2019-12-12 01:56:01

问题


I've this table

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)

Then in the Table Club i've this

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

what i actually need is to retrive the list of User. how should i do?

fetch this query, than have a for loop that fetches each member using its key?

i tried to use ndb.get_multi using the projection on member but it does not work. something like this

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

回答1:


get_multi works on a list of keys, you have a list of ClubMembership instances. You need to get the member key for each one:

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



回答2:


You should also consider to store membership information inside of user's entity. This way you can get all users in a single query, which is much faster.

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)


来源:https://stackoverflow.com/questions/27837399/ndb-many-to-many-retrieve-list-of-one-of-the-relation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!