Python ndb多对多,检索其中一个关系的列表
我有这张桌子Python ndb多对多,检索其中一个关系的列表,python,google-app-engine,google-cloud-datastore,data-modeling,app-engine-ndb,Python,Google App Engine,Google Cloud Datastore,Data Modeling,App Engine Ndb,我有这张桌子 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=s
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)
然后在表俱乐部中
我有这个
class Club(GCModel):
@property
def members(self):
return ClubMembership.query(ndb.AND(ClubMembership.club == self.key,
ClubMembership.membership_type == "MEMBER",
ClubMembership.is_active == True))
我实际需要的是检索用户的列表。我该怎么办
获取此查询,然后使用for循环使用其键获取每个成员
我尝试使用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)
get\u multi
用于键列表,您有一个ClubMembership实例列表。您需要为每个成员获取键:
memberships = ClubMembership.query(...)
member_keys = [m.member for m in memberships]
members = ndb.get_multi(member_keys)
get\u multi
用于键列表,您有一个ClubMembership实例列表。您需要为每个成员获取键:
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)
您还应该考虑在用户实体内部存储成员资格信息。这样,您可以在一个查询中获得所有用户,这要快得多
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)
那是我的感觉。如果我对memberships中的成员身份执行for循环(因为我需要一些其他处理):user=membership.member.get()
,是否会有任何性能差异?请参见-在循环中执行此操作将导致每个实体都有一个单独的RPC,这肯定比单个get\u多调用慢。最好一次获得所有用户并对结果进行处理。我明白了,那么,获得所有用户及其成员类型的最佳方式应该是什么?因为成员资格类型在成员资格列表中。因此,我使用get_multi获取用户,但现在:如何将用户与成员列表中的用户匹配以检索其成员类型?这两份名单的顺序会一样吗?@EsseTi easy。在检索到的用户上使用一个循环,在每个成员上再使用一个嵌套循环来查找成员匹配项。@EsseTi如果您想获取所有成员及其成员身份类型,可以执行类似于zip(memberships,ndb.get_multi([m.member for m in memberships])的操作,这是我的感觉。如果我对memberships中的成员身份执行for循环(因为我需要一些其他处理):user=membership.member.get()
,是否会有任何性能差异?请参见-在循环中执行此操作将导致每个实体都有一个单独的RPC,这肯定比单个get\u多调用慢。最好一次获得所有用户并对结果进行处理。我明白了,那么,获得所有用户及其成员类型的最佳方式应该是什么?因为成员资格类型在成员资格列表中。因此,我使用get_multi获取用户,但现在:如何将用户与成员列表中的用户匹配以检索其成员类型?这两份名单的顺序会一样吗?@EsseTi easy。在检索到的用户上使用一个循环,在每个成员上再使用一个嵌套循环来查找成员匹配项。@EsseTi如果要获取所有成员及其成员身份类型,可以执行类似zip的操作(memberships,ndb.get_multi([m.member for m in memberships]),我明白了,事实上,我对重复实体持怀疑态度,因为这看起来是非常罕见的情况,用户将成为许多俱乐部的成员,但这是你的决定。但我对课程也有同样的问题,人们可能会订阅许多课程。无论如何,数据的非标准化——这是应用程序引擎数据存储的一个好做法,您应该能够通过一个查询生成整个页面,以使其快速运行。我认为它甚至对课程也应该有效。有一点你是对的。要获得用户所属的所有俱乐部,我应该做什么?迭代用户的会员资格
,然后逐个检查会员资格是否为会员
?我明白了,事实是我对重复的实体非常怀疑,因为这样看来,当用户成为许多俱乐部的会员时,这种情况非常罕见,但这是你的决定。但我对课程也有同样的问题,人们可能会订阅许多课程。无论如何,数据的非标准化——这是应用程序引擎数据存储的一个好做法,你应该能够通过一个查询生成整个页面,使其快速运行。我认为它甚至对课程也应该有效。有一点你是对的。要获得用户所属的所有俱乐部,我应该做什么?迭代用户的成员身份
,然后逐个检查成员身份是否为成员类型
?