Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/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
Google app engine 如何查询多对多关系模型?-谷歌应用引擎_Google App Engine_Many To Many_Google Cloud Datastore_Bigtable - Fatal编程技术网

Google app engine 如何查询多对多关系模型?-谷歌应用引擎

Google app engine 如何查询多对多关系模型?-谷歌应用引擎,google-app-engine,many-to-many,google-cloud-datastore,bigtable,Google App Engine,Many To Many,Google Cloud Datastore,Bigtable,以下是我的模型: class User(db.Model): id = db.StringProperty(required=True) created = db.DateTimeProperty(auto_now_add=True) updated = db.DateTimeProperty(auto_now=True) name = db.StringProperty(required=True) email = db.StringProperty()

以下是我的模型:

class User(db.Model):
    id = db.StringProperty(required=True)
    created = db.DateTimeProperty(auto_now_add=True)
    updated = db.DateTimeProperty(auto_now=True)
    name = db.StringProperty(required=True)
    email = db.StringProperty()

class Page(db.Model):
    id = db.StringProperty(required=True)
    created = db.DateTimeProperty(auto_now_add=True)
    updated = db.DateTimeProperty(auto_now=True)
    name = db.StringProperty(required=True)
    link = db.StringProperty(required=True)

class UserPage(db.Model): 
    user = db.ReferenceProperty(User, collection_name='pages') 
    page = db.ReferenceProperty(Page, collection_name='users')
如何构造查询以查找用户页面


我发现一篇文章描述了一种方法,但这是最好的方法吗

经过一些测试,我似乎可以使用:

 myuser = User.get_by_key_name("1")
 up = UserPage.all().filter('user =', myuser).fetch(5)
 for x in up:
     self.response.out.write(x.page.id)

您的答案将起作用,但它将对数据存储执行7次调用:

  • 1用于对用户的调用。通过\u键\u名称()获取\u
  • 1用于调用UserPage…fetch()
  • 循环内x.page.id的每次解引用为5
另一种仅对数据存储进行3次调用的方法如下:

myuser = User.get_by_key_name("1") 
up = UserPage.all().filter('user =', myuser).fetch(5)
keys = [UserPage.page.get_value_for_datastore(x) for x in up]
pages = db.get(keys)
for p in pages: 
     self.response.out.write(p.id)

有关更多详细信息,请参阅。

我建议使用不同的方法,与您的
UserPage
关系相比,这种方法不太“面向关系”:

class User(db.Model):
    id = db.StringProperty(required=True)
    created = db.DateTimeProperty(auto_now_add=True)
    updated = db.DateTimeProperty(auto_now=True)
    name = db.StringProperty(required=True)
    email = db.StringProperty()

class Page(db.Model):
    id = db.StringProperty(required=True)
    created = db.DateTimeProperty(auto_now_add=True)
    updated = db.DateTimeProperty(auto_now=True)
    name = db.StringProperty(required=True)
    link = db.StringProperty(required=True)

    # Users linking to this page
    users = db.ListProperty(db.Key)
然后,您可以通过以下查询获取特定用户的所有页面:

Page.gql("WHERE users = :1", user.key())
请注意,您应该将键的列表属性放在期望较少项的一侧。我假设与链接到用户的页面相比,您喜欢某个页面的用户更少,因此我将其放在
页面
侧,但这取决于您的特定用例


有关多对多主题的官方建议,请参见此处:

哦,非常好!我不知道这个环路这么贵。Thx用于提示。Thx用于此方法和文章。我会用它做一些测试。再次感谢你,我最终选择了这种方法。