It looks like KeyProperty's kind validation doesn't work for subclass of 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()

Exception:

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

looks like the same thing as Guido van Rossum said in Can ndb.KeyProperty reference a base model class when using model inheritance?

有帮助吗?

解决方案

It's actually working as expected.

You can only have parent = ndb.KeyProperty(kind="Item") as the kind of Folder as stored in the datastore is Item.

It has additional properties that define it's inheritance heriarchy and allows you to perform queries like Item.query() and get all subclasses of Item.

Have another read of PolyModel docs and have a look at the entities as stored in the datastore, then everything will be clear.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top