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
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用于此方法和文章。我会用它做一些测试。再次感谢你,我最终选择了这种方法。