4

我有一些模型共享一组公共属性,我在其他模型继承的基本模型类中定义了这些属性:

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声明,指出它需要一个带有 kind 的键,BaseUser但被赋予了DerivedUserA.

如果我kind从 my 中删除参数MainModel,它会起作用:

class MainModel(ndb.Model):
    user = ndb.KeyProperty()

我可以忍受,但我宁愿检查一下,以确保我没有试图在MainModel.user财产中保存任何类型的实体。有没有办法做到这一点?

4

2 回答 2

3

使用 PolyModel 进行数据存储继承 -> https://developers.google.com/appengine/docs/python/ndb/polymodelclass

于 2012-08-15T19:55:39.057 回答
3

这不起作用的原因是 kind 参数KeyProperty()会立即转换为字符串。
由于它只是一个验证功能,我们可以考虑修复这个问题。
如果您喜欢这个想法,您可以在跟踪器中提交功能请求:http ://code.google.com/p/appengine-ndb-experiment/issues/list - 这将不如 PolyModel 重量级(尽管看起来PolyModel 可能就是您正在寻找的东西)。

于 2012-08-15T20:33:43.870 回答