使用KeyProperty,多态模型看起来效果不佳

时间:2014-04-05 05:38:17

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

看起来KeyProperty的kind验证不适用于PolyModel的子类。

from google.appengine.ext import ndb
from google.appengine.ext.ndb import polymodel


class Item(polymodel.PolyModel):
    parent = ndb.KeyProperty(kind="Folder")

class Folder(Item):
    title = ndb.StringProperty()

    def add_item(self, item):
        item.set_parent(self.key)

class File(Item):
    pass


class Main(webapp2.RequestHandler):
    def get(self):
        rootfolder = Folder(title="root")
        rootfolder.put()

        # the next line raise exception
        subfolder = Folder(title="Cool things", parent=rootfolder.key) 
        subfolder.put()

例外:

line 1935, in _validate
    'Expected Key with kind=%r, got %r' % (self._kind, value))
BadValueError: Expected Key with kind='Folder', got Key('Item', 6544293208522752)

看起来像Guido van Rossum所说的那样 Can ndb.KeyProperty reference a base model class when using model inheritance?

1 个答案:

答案 0 :(得分:1)

它实际上按预期工作。

您只能将parent = ndb.KeyProperty(kind="Item")作为存储在数据存储区中的文件夹类型为Item。

它有其他属性来定义它的继承heriarchy,并允许你执行Item.query()之类的查询并获取Item的所有子类。

再次阅读PolyModel文档并查看存储在数据存储区中的实体,然后一切都将清晰。