2012-09-02 84 views
0

我想將一個polymodel類與NBD類結合起來。鑑於以下問題,任何幫助澄清「最好」的方式來做到這一點都會很有幫助。梳理PolyModel與NDB

我有一個polymodel的水果(Fruit -> Tree-Bearing -> Apples -> Granny Smith - 作爲一個polymodel層次結構的例子),我想將它存儲在一個叫做Diet的ndb.Model中。很顯然,我有一個類別的水果,蔬菜類別等。這應該如何構建?

到目前爲止我有:

class Diet(ndb.Model): 
    nameOfDiet = ndb.StringProperty() 
    fruit = ndb.StructuredProperty(Fruit) 
    vegetable = ndb.StructuredProperty(Vegetable) 

問題,這一點 - 因爲我覺得我是正確的讀它,是飲食的水果和蔬菜的對象是「非可查詢」。我顯然希望用戶能夠搜索符合他們特定水果的飲食。我也想利用ndb的緩存功能。我怎樣纔能有效地查詢水果,如果我想要所有的奶奶史密斯飲食,我可以得到它沒有返回任何值沒有。另外,有沒有可能用NDB做poly模型?如果不是的話,我會如何改變水果的結構,使之符合我想要的和B)至少在名義上是有效的?

非常感謝! Jon

+0

用戶是否可以向層次結構添加新成果? –

回答

3

我不認爲你需要在這種情況下使用polymodel。 您可以使用水果的列表屬性,其中包含水果的層次結構。

class Diet(ndb.Model): 
    name = ndb.StringProperty() 
    fruit = ndb.StringProperty(repeated=True) 
    vegetable = ndb.StringProperty(repeated=True) 

水果屬性可以包含[「樹軸承」,「蘋果」,「澳洲青苹」,「樹軸承」,「蘋果」,「金冠」,「樹軸承」,「橙子。 然後,如果你想找到的飲食與「蘋果」,你可以做到以下幾點:

results = Diet.query(Diet.fruit == 'Apples').fetch(20) 

或者,如果你想找到包含「蘋果」和「橘子」減肥,你可以使用IN詢問。

results = Diet.query(Diet.fruit.IN(['Apples', 'Oranges']) 

如果有您需要關於每個水果的更多細節,例如:含糖量,季節等,你可以創建一個水果,其中KEY_NAME是水果的名稱型號(使它快速獲取關於水果的數據)。如果需要的話,水果模型可以包含父母的層次結構。

class Fruit(ndb.Model): 
    name = ndb.StringProperty() 
    sugar_content = ndb.FloatProperty() 

因此,要獲得有關'金冠'的詳細信息,您將構建密鑰並獲取數據。獲取數據可以使用Map函數異步完成。通過Key獲取還會爲您緩存數據,因此後續獲取將直接來自memcache。

gd =ndb.Key("Fruit", "Golden Delicious").get() 

另一種選擇:店水果對象爲一結構化的屬性(如你目前完成),但要重複的結構特性。

class Diet(ndb.Model): 
    name = ndb.StringProperty() 
    fruit = ndb.StructuredProperty(Fruit, repeated=True) 

查詢可以以類似的方式來完成對你的飲食模式的結構化屬性:

results = Diet.query(Diet.fruit.name == 'Orange') 

最後,polymodels是可能的NDB,請參閱:https://developers.google.com/appengine/docs/python/ndb/polymodelclass

對於位有關異步獲取數據的信息,請參閱:https://developers.google.com/appengine/docs/python/ndb/async

+0

還有一個組成部分,比如說我想統計所有含有果樹的飲食,我該怎麼做? – Jon

+0

計數通常最好在實體寫入時完成。所以當有人用含有樹木的果實創造飲食時,你會增加一個計數器。當你想要檢索多少食物有樹的果實時,你只需取數。如果您懷疑會每秒創建一種以上的飲食,請考慮使用分片https://developers.google.com/appengine/articles/sharding_counters –