Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ndb多对多,检索其中一个关系的列表_Python_Google App Engine_Google Cloud Datastore_Data Modeling_App Engine Ndb - Fatal编程技术网

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]),我明白了,事实上,我对重复实体持怀疑态度,因为这看起来是非常罕见的情况,用户将成为许多俱乐部的成员,但这是你的决定。但我对课程也有同样的问题,人们可能会订阅许多课程。无论如何,数据的非标准化——这是应用程序引擎数据存储的一个好做法,您应该能够通过一个查询生成整个页面,以使其快速运行。我认为它甚至对课程也应该有效。有一点你是对的。要获得用户所属的所有俱乐部,我应该做什么?迭代用户的
会员资格
,然后逐个检查会员资格是否为
会员
?我明白了,事实是我对重复的实体非常怀疑,因为这样看来,当用户成为许多俱乐部的会员时,这种情况非常罕见,但这是你的决定。但我对课程也有同样的问题,人们可能会订阅许多课程。无论如何,数据的非标准化——这是应用程序引擎数据存储的一个好做法,你应该能够通过一个查询生成整个页面,使其快速运行。我认为它甚至对课程也应该有效。有一点你是对的。要获得用户所属的所有俱乐部,我应该做什么?迭代用户的
成员身份
,然后逐个检查成员身份是否为
成员类型