从数据存储中检索分层数据

时间:2010-10-28 10:31:53

标签: python google-app-engine google-cloud-datastore

我正在使用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

2 个答案:

答案 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