Python 将PolyModel与NDB相结合

Python 将PolyModel与NDB相结合,python,performance,google-app-engine,app-engine-ndb,Python,Performance,Google App Engine,App Engine Ndb,我正在尝试将polymodel类与NBD类结合起来。考虑到以下问题,任何澄清“最佳”方法的帮助都将是巨大的 我有一个水果的多模型(水果->结果树->苹果->史密斯奶奶-/code>-作为多模型层次结构的一个示例),我想将其存储在一个名为Diet的ndb.Model中。很明显,我有一个水果的类别,一个蔬菜的类别,等等。这应该如何构建 到目前为止,我已经: class Diet(ndb.Model): nameOfDiet = ndb.StringProperty() fruit =

我正在尝试将polymodel类与NBD类结合起来。考虑到以下问题,任何澄清“最佳”方法的帮助都将是巨大的

我有一个水果的多模型(
水果->结果树->苹果->史密斯奶奶-/code>-作为多模型层次结构的一个示例),我想将其存储在一个名为Diet的ndb.Model中。很明显,我有一个水果的类别,一个蔬菜的类别,等等。这应该如何构建

到目前为止,我已经:

class Diet(ndb.Model):
    nameOfDiet = ndb.StringProperty()
    fruit = ndb.StructuredProperty(Fruit)
    vegetable = ndb.StructuredProperty(Vegetable)
这个问题——我想我读对了,就是饮食中的水果和蔬菜对象是“不可查询的”。我显然希望用户能够搜索与他们特定水果相匹配的饮食。我还想利用ndb的缓存功能。我怎样才能高效地查询水果,这样,如果我想要所有史密斯奶奶的食谱,我就可以得到它,而不返回任何值为零的。另外,有可能用NDB做多边形模型吗?如果不是,我将如何改变水果的结构,以A)匹配我想要的和B)至少名义上有效

非常感谢!
Jon

我认为在这种情况下不需要使用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)
或者,如果你想找到一种含有“苹果”和“橙子”的饮食,你可以在查询中使用

results = Diet.query(Diet.fruit.IN(['Apples', 'Oranges'])
如果您需要关于每种水果的更多详细信息,例如:糖含量、季节等,您可以为水果创建一个模型,其中key_name是水果的名称(以便快速获取有关水果的数据)。如果需要,水果模型可以包含亲本的层次结构

class Fruit(ndb.Model):
    name = ndb.StringProperty()
    sugar_content = ndb.FloatProperty()
因此,要获得有关“Golden Delicious”的详细信息,您需要构建密钥并获取数据。可以使用Map函数异步获取数据。按键获取也会为您缓存数据,因此后续获取直接来自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')
最后,ndb可以使用多模型,请参见:


有关异步获取数据的一些信息,请参阅:

我认为在本例中不需要使用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)
或者,如果你想找到一种含有“苹果”和“橙子”的饮食,你可以在查询中使用

results = Diet.query(Diet.fruit.IN(['Apples', 'Oranges'])
如果您需要关于每种水果的更多详细信息,例如:糖含量、季节等,您可以为水果创建一个模型,其中key_name是水果的名称(以便快速获取有关水果的数据)。如果需要,水果模型可以包含亲本的层次结构

class Fruit(ndb.Model):
    name = ndb.StringProperty()
    sugar_content = ndb.FloatProperty()
因此,要获得有关“Golden Delicious”的详细信息,您需要构建密钥并获取数据。可以使用Map函数异步获取数据。按键获取也会为您缓存数据,因此后续获取直接来自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')
最后,ndb可以使用多模型,请参见:


有关异步获取数据的一些信息,请参阅:

还有一个附加组件,假设我想计算所有含有树果实的饮食,我该如何做?通常在编写实体时最好进行计数。所以,当有人创造了一个有树果实的饮食,你增加了一个计数器。当您想要检索有多少种饮食结了树果实时,只需获取计数即可。如果你怀疑每秒都会产生一个以上的饮食,考虑使用你的柜台上的分叉,有一个额外的组成部分,比如说我想计算所有含有树果的饮食,我会怎么做呢?所以,当有人创造了一个有树果实的饮食,你增加了一个计数器。当您想要检索有多少种饮食结了树果实时,只需获取计数即可。如果你怀疑每秒都会创建一个以上的饮食,考虑使用你的计数器的分词,用户是否能够向层次结构中添加新的水果?用户是否能够向层次结构中添加新的水果?