2013-03-08 60 views
0

我想查詢具有計算屬性的ndb模型,但它返回一個空列表。 This answer表明我應該能夠查詢計算出的屬性,the docs也是如此。我究竟做錯了什麼?帶計算屬性的NDB查詢返回一個空白列表

from django.template import defaultfilters 
class Video(models.SfxModel): 

    title = ndb.StringProperty() 
    slug = ndb.ComputedProperty(
    lambda self: str(defaultfilters.slugify(self.title))) 

在交互式控制檯

from app.lib.videos import Video 

slug = Video.query().get().slug 
print slug 
# => "some-dasherized-string" 
print Video.query(Video.slug == slug).fetch() 
# => [] 

回答

0

的 '問題' 你有對非ancestor queries給出的eventual consistency
你所看到的對於高複製數據存儲是完全正常的。 當你放置一個實體並對它進行查詢時,它可能是因爲它沒有被複制到所有數據中心,所以無法找到它。

如果你想要這個工作,你必須通過向實體添加父項來使用實體組。 這可以是實體密鑰或不屬於任何存儲實體的構造密鑰。

這個工程:

class Video(ndb.Model): 
    title = ndb.StringProperty() 
    slug = ndb.ComputedProperty(lambda self: self.title.replace(' ', '-')) 

v = Video(parent = ndb.Key(Video, 'xxx'), title = 'foo bar') 
v.put() 

print Video.query(Video.slug == v.slug, ancestor = ndb.Key(Video, 'xxx')).get() 
+0

我有點搞不清楚爲什麼實體組是非常重要的。爲什麼我想要將視頻聲明爲視頻實體的父項?如果我做了,哪個實體會是父母?在你的示例代碼中,是否是佔位符「xxx」?還是它意味着什麼? 感謝您的快速響應。另外,我上面顯示的代碼在'dev_appserver'中。這會改變什麼嗎? – mehulkar 2013-03-08 22:30:23

+0

這就是數據存儲如何與實體組一起工作以及最終的一致性。父母只是一個生成的密鑰。應該看看我指出的文檔。如果你保存一個實體並在它不保證被一個非祖先查詢返回後立即進行查詢。它的SDK是爲了反映生產環境,所以你也應該在生產中期待這一點。但它可能在1秒後...看看這裏https://developers.google.com/appengine/docs/python/datastore/structuring_for_strong_consistency – aschmid00 2013-03-09 15:04:29

+1

但這並不意味着你需要使用祖先。如果您在創建後不需要查詢該特定實體,那麼您將很好地處理最終的一致性。 – aschmid00 2013-03-09 15:05:47