我有一些共享一组共同属性的模型,我在基础模型类中定义了这些属性,其他模型继承这些属性:
class BaseUser(ndb.Model):
name = ndb.StringProperty()
class DerivedUserA(BaseUser):
# some additional properties...
class DerivedUserB(BaseUser):
# some additional properties...
在其他一些模型中,我需要引用任何BaseUser
派生的模型:
class MainModel(ndb.Model):
user = ndb.KeyProperty(kind = BaseUser)
但是,当我尝试将DerivedUserA
实体密钥设置为MainModel.user
属性时,GAE会引发一个BadValueError
,表示它期待一个类型为BaseUser
的密钥,但是获得了DerivedUserA
。
如果我从kind
中移除MainModel
参数,则可以正常运行:
class MainModel(ndb.Model):
user = ndb.KeyProperty()
我可以忍受这种情况,但我宁愿检查一下,以确保我不会在MainModel.user
属性中保存任何类型的实体。有没有办法做到这一点?
答案 0 :(得分:3)
使用PolyModel进行数据存储继承 - > https://developers.google.com/appengine/docs/python/ndb/polymodelclass
答案 1 :(得分:3)
这不起作用的原因是KeyProperty()
的种类参数会立即转换为字符串
由于它只是一个验证功能,我们可以考虑解决这个问题
如果你喜欢这个想法,你可以在跟踪器中提交一个功能请求:http://code.google.com/p/appengine-ndb-experiment/issues/list - 这比PolyModel重量级要小(尽管看起来PolyModel可能就是你想要的)。