2010-10-28 77 views
0

我使用Google App Engine(和Python)构建应用程序。我有两个关于从数据存储检索数据的问题。从数据存储中检索层次结构数据

我有关于用户和用户发布的信息。这里是数据库模型的一部分:

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

回答

3

如果你想做到这一点,你需要进行非规范化:存储用户的国家对他们的所有帖子上复制和查询。数据存储不支持连接,这是满足此查询所需的连接,并且在任何情况下,非规范化效率都会更高。

只要检索'全部'结果,你可以指定一个任意大的限制,但是考虑:你真的想这样做吗?您一次可以合理地向用户展示多少结果是有限制的;如果你有更多的结果,你几乎可以肯定想分页。

0

借调反规范化。如果国家是您需要频繁查询的特定事物,则可以为其添加新模型。国家就成为一个的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视为可迭代检索所有的结果。查看App Engine文档:http://code.google.com/appengine/docs/python/datastore/queryclass.html#Query_fetch