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