2010-10-28 127 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