NDB PolyModel Проблемы
Я работаю над приложением Google App Engine, в котором мы используем polymodel для выражения подмножества сущностей. У меня проблемы с тем, как документы утверждают, что это работает.
Моя первая проблема заключается в том, что я заметил, что вызов "унаследованного" метода для объекта, который является типом подкласса, вместо этого вызывает версию этого метода родительской полимодели, которая является просто "проходом". Таким образом, метод возвращает None и все портит.
РЕДАКТИРОВАТЬ: Кажется, что это имеет место не только для вызова метода, но и для всех его свойств. Когда я пытаюсь зарегистрировать некоторую конкретную информацию, которая есть у подкласса, но у родителя нет, он выдает ошибку, говорящую, что он не может найти эту информацию.
например
class Parent(polymodel.PolyModel):
def someMethod(self, params):
pass
class Child(Parent):
def someMethod(self, params):
{{logic}}
return something
Вторая проблема, которую я обнаружил в результате попытки решить первую, заключается в том, что метод class_name(), который, как сообщается, существует здесь: https://cloud.google.com/appengine/articles/polymodel, делает не похоже на работу.
Когда я звоню, я получаю ошибку сервера, которая заканчивается AttributeError: 'Parent' object has no attribute 'class_name'
, Мой класс на самом деле не называется "Родитель", я просто хотел придерживаться моего предыдущего примера.
Это все очень расстраивает, и я действительно не знаю, как поступить. Любая помощь приветствуется!
РЕДАКТИРОВАТЬ
Вот, пожалуй, более подробное описание происходящего:
Я определил класс полимодели, который я не хочу создавать; Я только хочу, чтобы он служил в качестве шаблона класса. У него есть методы шаблона, которые я хочу определить во всех его дочерних элементах; все pass
, Он живет в моем файле основных моделей
class Template(polymodel.PolyModel):
def method_one(self):
logging.error("ENTERED TEMPLATE METHOD, THIS SHOULD NOT HAPPEN")
pass
def method_two(self):
logging.error("ENTERED TEMPLATE METHOD, THIS SHOULD NOT HAPPEN")
pass
В другом файле, назовем его template_extension_models.py, в том же каталоге, что и основной файл моделей, я определил расширение модели Template, которая заполняет ее методы реальной логикой.
class TemplateExtension(Template):
def method_one(self):
"""
some logic specific to this class, actually
takes inputs and returns something
"""
def method_two(self):
"""
some logic specific to this class, actually
takes inputs and returns something
"""
Вернувшись в основной файл моделей, у нас есть определенные классы, которые имеют ndb.KeyProperties, которые указывают на "Шаблон". Надежда / допущение состоит в том, что это будет действовать как другие модели наследования, и поэтому, когда мы извлекаем из хранилища данных сущность типа / подтипа 'Template', мы можем вызвать ее method_one() и method_two() и код для этого конкретного Будет запущен метод method_one и method_two экземпляра. т.е.
class OtherThing(ndb.Model):
template = ndb.KeyProperty(kind=Template)
def get_template_and_call_method(self):
template = self.template.get()
res = template.method_one()
do_something_with(res)
Вот где моя проблема происходит. На самом деле мы никогда не используем Template; для каждого экземпляра "OtherThing" мы фактически присваиваем экземпляр TemplateExtension. Тем не менее, случайно, не каждый раз, после извлечения шаблона в методе OtherThing (обобщение нескольких мест в моем фактическом коде), я вижу, что вызывается метод родительского класса Template вместо класса TemplateExtension, который вызывает тонну ошибки. Так как это происходит не каждый раз, я не уверен, где начать искать проблему.
1 ответ
Это называется _class_name()
с ведущим подчеркиванием.
https://cloud.google.com/appengine/docs/python/ndb/polymodelclass