在我的GAE项目中,我有一个名为Part的基类。 从这个课程中我得到了其他课程,如电机和电池。
如果我运行以下内容:
motors = Motor.query().fetch()
batterys = Battery.query().fetch()
我将获得所有部件,但我正在寻找更优雅的东西。 如果我跑:
parts = Part.query().fetch()
我得到一个空列表[]。
如何运行上述查询并将所有结果放在一个列表中? 谢谢
答案 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"
。