【问题标题】:Combing PolyModel with NDB将 PolyModel 与 NDB 相结合
【发布时间】:2012-09-02 05:00:23
【问题描述】:

我正在尝试将一个多模型类与一个 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) 至少在名义上有效?

非常感谢! 乔恩

【问题讨论】:

  • 用户能否向层次结构添加新的水果?

标签: python performance google-app-engine app-engine-ndb


【解决方案1】:

我认为您不需要在这种情况下使用 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

【讨论】:

  • 还有一个额外的组成部分,比如说我想计算所有含有树果的饮食,我该怎么做?
  • 通常最好在写入实体时进行计数。所以当有人用树上的水果创造饮食时,你会增加一个计数器。当您想检索有多少饮食有树果时,您只需获取计数。如果您怀疑每秒会创建多个饮食,请考虑为您的计数器使用分片developers.google.com/appengine/articles/sharding_counters
猜你喜欢
  • 1970-01-01
  • 2017-03-22
  • 2019-12-02
  • 2012-05-19
  • 2020-05-04
  • 1970-01-01
  • 2014-10-23
  • 2011-08-11
  • 2011-11-13
相关资源
最近更新 更多