ndb.PolyModel 作为常规实体的祖先 - 坏主意?
ndb.PolyModel as an ancestor of a regular entity -- bad idea?
我想使一个 ndb.PolyModel 子实体成为另一个 ndb.Model 实体的祖先,因为我需要子实体对于查询是高度一致的。
这件事让我很紧张。这是个坏主意吗?
据我所知,ndb.PolyModel 背后的秘诀是它的实例有一个特殊的 属性,称为 'class'。
这是继承链中所有 class 名称的重复 属性 字符串,ndb 然后在将其拉出时使用它来实例化适当的子 class数据存储。
每个实例的键仍然是父实例的键 class。
所以对于下面的例子:
class Animal(ndb.PolyModel):
class Cat(Animal):
class Dog(Animal):
如果你这样做
d = Dog(...)
d.put()
d.key
仍然是 ndb.Key('Animal', 123456789)
在您的数据存储区查看器中,您将只有 Animal
table 而不是 Dog
table 或 Cat
table .
所以我想你应该安全地使用 ndb.Key('Animal', 123456789)
作为其他模型的祖先。
我想使一个 ndb.PolyModel 子实体成为另一个 ndb.Model 实体的祖先,因为我需要子实体对于查询是高度一致的。
这件事让我很紧张。这是个坏主意吗?
据我所知,ndb.PolyModel 背后的秘诀是它的实例有一个特殊的 属性,称为 'class'。
这是继承链中所有 class 名称的重复 属性 字符串,ndb 然后在将其拉出时使用它来实例化适当的子 class数据存储。
每个实例的键仍然是父实例的键 class。
所以对于下面的例子:
class Animal(ndb.PolyModel):
class Cat(Animal):
class Dog(Animal):
如果你这样做
d = Dog(...)
d.put()
d.key
仍然是 ndb.Key('Animal', 123456789)
在您的数据存储区查看器中,您将只有 Animal
table 而不是 Dog
table 或 Cat
table .
所以我想你应该安全地使用 ndb.Key('Animal', 123456789)
作为其他模型的祖先。