Может ли ndb.KeyProperty ссылаться на базовый класс модели при использовании наследования модели?
У меня есть некоторые модели, которые имеют общий набор свойств, которые я определил в классе базовой модели, от которого наследуются другие модели:
class BaseUser(ndb.Model):
name = ndb.StringProperty()
class DerivedUserA(BaseUser):
# some additional properties...
class DerivedUserB(BaseUser):
# some additional properties...
В какой-то другой модели мне нужна ссылка на любой BaseUser
модель:
class MainModel(ndb.Model):
user = ndb.KeyProperty(kind = BaseUser)
Тем не менее, когда я пытаюсь установить DerivedUserA
ключ сущности к MainModel.user
собственность, GAE поднимает BadValueError
заявив, что он ожидает ключ с видом BaseUser
но был дан DerivedUserA
,
Если я удалю kind
аргумент из моего MainModel
, оно работает:
class MainModel(ndb.Model):
user = ndb.KeyProperty()
Я мог бы жить с этим, но я бы предпочел иметь проверку, чтобы убедиться, что я не пытаюсь сохранить какую-либо сущность в MainModel.user
имущество. Есть способ сделать это?
2 ответа
Используйте PolyModel для наследования хранилища данных -> https://developers.google.com/appengine/docs/python/ndb/polymodelclass
Причина, по которой это не работает, заключается в том, что параметр типа KeyProperty()
немедленно переводится в строку.
Поскольку это всего лишь функция проверки, мы могли бы исправить это.
Если вам нравится эта идея, вы можете подать запрос функции в трекере: http://code.google.com/p/appengine-ndb-experiment/issues/list - это будет менее тяжелым, чем PolyModel (хотя кажется, PolyModel может быть то, что вы ищете в любом случае).