2012-09-02 118 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 –