问题
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