Полимодель выглядит не очень хорошо с KeyProperty

Похоже, 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)

выглядит так же, как сказал Гвидо ван Россум в Can ndb.KeyProperty ссылаться на базовый класс модели при использовании наследования модели?

1 ответ

Решение

Это на самом деле работает, как ожидалось.

Вы можете иметь только parent = ndb.KeyProperty(kind="Item") как тип Папки, который хранится в хранилище данных, это Item.

Он имеет дополнительные свойства, которые определяют его наследование по наследству и позволяет вам выполнять запросы, такие как Item.query() и получать все подклассы Item.

Еще раз прочитайте документы PolyModel и посмотрите на сущности, хранящиеся в хранилище данных, тогда все будет ясно.

Другие вопросы по тегам