Google App Engine - 检索从基类派生的类的实例

时间:2013-11-10 15:55:11

标签: python google-app-engine

在我的GAE项目中,我有一个名为Part的基类。 从这个课程中我得到了其他课程,如电机和电池。

如果我运行以下内容:

motors   = Motor.query().fetch()
batterys = Battery.query().fetch()

我将获得所有部件,但我正在寻找更优雅的东西。 如果我跑:

parts    = Part.query().fetch()

我得到一个空列表[]。

如何运行上述查询并将所有结果放在一个列表中? 谢谢

2 个答案:

答案 0 :(得分:2)

您可以执行此操作,但所有Parts类都必须从PolyModel继承

https://developers.google.com/appengine/docs/python/ndb/polymodelclass

所以

class Part(ndb.PolyModel):
  #stuff

class Motor(Part):
  # stuff

class Wheel(Part):
  # stuff

parts = Part.query().fetch()

但是,所有项目都作为Part存储在数据存储区中,它们还有一个classes属性,用于命名其继承层次结构中的每个类。然后,当检索实体时,实例化正确的子类。

另一个潜在的缺点是,如果您拥有任何属性的默认值,则存储模型中的属性名称是所有子类的并集。我没有检查过这有多远。因此,如果在所有子类中有许多非常不同的属性,则可能存储大量空属性,并且会产生在每个实体中存储所有属性名称的成本。

答案 1 :(得分:1)

数据存储区没有继承概念,也不知道您的实体类型派生自Part。

使用GAE实际上没有办法做这种事情:祖先键并不是真正的答案,因为它们会从单个部件下降所有电机/电池实体,会严重限制更新率。

建模这种关系的最佳方法是放弃单独的模型并使用单个零件模型,part_type字段可以是"motor""battery"