Может ли 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 может быть то, что вы ищете в любом случае).

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