2014-04-05 3 views
0

Похоже, что проверка 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?

ответ

1

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

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

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

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

+0

Я думаю, что «вид» предназначен только для проверки, так как он хранится в хранилище данных, это проблема? – lucemia

+1

За исключением проверки выполняется во время посылки. В этот момент вы, вероятно, обнаружите, что внутренняя трансформация PolyModel уже возникла. Также посмотрите на код и посмотрите, что он на самом деле проверяет. Если вы хотите ограничить свойство 'Folder', тогда напишите свою собственную функцию проверки. –

+1

Также повторите ошибку проверки. «Ключ» проверяется не классом, а «ключ» объекта «Папка» на основе ваших классов - «ключ» («Item», 6544293208522752) », а из« Key »мы видим, что тип« Item » 'не' Folder'. –