使用模型继承时,ndb.KeyProperty可以引用基本模型类吗?

时间:2012-08-15 14:41:13

标签: google-app-engine app-engine-ndb

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

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属性中保存任何类型的实体。有没有办法做到这一点?

2 个答案:

答案 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可能就是你想要的)。