0

我正在尝试将 polymodel 类与 NBD 类结合起来。鉴于以下问题,任何有助于澄清“最佳”方法的帮助都会很好。

我有一个水果的多模型(Fruit -> Tree-Bearing -> Apples -> Granny Smith- 作为多模型层次结构的示例),我想将它存储在一个名为 Diet 的 ndb.Model 中。所以很明显我有一个水果类别,一个蔬菜类别等。这应该如何构建?

到目前为止,我有:

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

这个问题 - 我认为我没有看错,饮食中的水果和蔬菜对象是“不可查询的”。我显然希望用户能够搜索与其特定水果相匹配的饮食。我还想利用 ndb 的缓存功能。我怎样才能有效地查询水果,这样如果我想要所有史密斯奶奶的饮食,我就可以得到它,而不会返回任何值为 none 的东西。另外,有没有可能用 NDB 做多边形模型?如果不是,我将如何将水果的结构更改为 A) 匹配我想要的并且 B) 至少在名义上有效?

非常感谢!乔恩

4

1 回答 1

3

我认为您不需要在这种情况下使用 polymodel。您可以使用水果的列表属性,其中包含水果的层次结构。

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

Fruit 属性可以包含 ['Tree-Bearing', 'Apples', 'Granny Smith', 'Tree-Bearing', 'Apples', 'Golden Delicious', 'Tree-Bearing', 'Oranges']。然后,如果您想找到带有“苹果”的饮食,您可以执行以下操作:

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

或者,如果您想查找包含“Apples”和“Oranges”的饮食,您可以使用 IN 查询。

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

如果您需要有关每种水果的更多详细信息,例如:糖含量、季节等,您可以为水果创建一个模型,其中 key_name 是水果的名称(以便快速获取有关水果)。如果需要,水果模型可以包含父母的层次结构。

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

因此,要获取有关“Golden Delicious”的详细信息,您将构建密钥并获取数据。可以使用 Map 函数异步获取数据。按键获取也会为您缓存数据,因此后续获取直接来自内存缓存。

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

另一种选择:将 Fruit 对象存储为结构化属性(如您当前所做的那样),但重复结构化属性。

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

可以以类似的方式对饮食模型中的结构化属性进行查询:

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

最后,ndb 可以使用多模型,请参阅:https ://developers.google.com/appengine/docs/python/ndb/polymodelclass

有关异步获取数据的一些信息,请参阅:https ://developers.google.com/appengine/docs/python/ndb/async

于 2012-09-02T09:14:32.260 回答