我正在使用Google App Engine(和Python)构建应用。关于从数据存储中检索数据,我有两个问题。
我有关于用户的信息以及有关用户发布的信息。以下是DB Models的一部分:
class User(db.Model):
country = db.StringProperty()
# many other entities
class Post(db.Model):
author = db.ReferenceProperty(User)
# many other entities
我想检索由特定国家/地区的用户制作的帖子。我这样试过:
posts_query = Post.all().filter(' author.country == ', country)
posts = posts_query.fetch(limit = 100)
但是此查询不会返回任何结果(国家/地区变量具有数据存储区中存在的值)。我需要在查询中更正,所以它有效吗?
第二个问题:如果(在特定情况下)我可以从数据存储区检索所有帖子,如果帖子计数未知(并且可能> 100)?
提前致谢,
-skazhy
答案 0 :(得分:3)
如果你想这样做,你需要反规范化:在他们所有的帖子上存储用户所在国家的副本,然后查询。数据存储区不支持连接,这是满足此查询所必需的,并且在任何情况下,非规范化都会更有效。
就检索“所有”结果而言,您可以指定一个任意大的限制,但请考虑:您真的想要这样做吗?您可以一次性向用户明智地呈现多少结果;如果你有更多的结果,你几乎肯定想要分页。
答案 1 :(得分:0)
借调非规范化。如果country是您需要经常查询的特定事物,则可以为其添加新模型。然后,Country成为用户和帖子的ReferenceProperty:
class User(db.Model):
country = db.ReferenceProperty(Country,collection_name=users)
# many other entities
class Post(db.Model):
author = db.ReferenceProperty(User)
country = db.ReferenceProperty(Country,collection_name=posts)
# many other entities
class Country(db.Model):
name = db.StringProperty()
# posts from everyone in the user's country:
# user.country.posts.all()
在回答第二个问题时,您可以将posts_query用作iterable来检索所有结果。请参阅App Engine文档:http://code.google.com/appengine/docs/python/datastore/queryclass.html#Query_fetch