Похоже, что проверка KeyProperty kind
не подходит для подкласса PolyModel
.Полимодель выглядит не очень хорошо с KeyProperty
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 reference a base model class when using model inheritance?
Я думаю, что «вид» предназначен только для проверки, так как он хранится в хранилище данных, это проблема? – lucemia
За исключением проверки выполняется во время посылки. В этот момент вы, вероятно, обнаружите, что внутренняя трансформация PolyModel уже возникла. Также посмотрите на код и посмотрите, что он на самом деле проверяет. Если вы хотите ограничить свойство 'Folder', тогда напишите свою собственную функцию проверки. –
Также повторите ошибку проверки. «Ключ» проверяется не классом, а «ключ» объекта «Папка» на основе ваших классов - «ключ» («Item», 6544293208522752) », а из« Key »мы видим, что тип« Item » 'не' Folder'. –