Я работаю над приложением Google для приложений Google, в котором мы используем полимодель для выражения подмножества объектов. У меня возникли проблемы с его использованием в том смысле, что документы требуют, чтобы он работал.NDB PolyModel Problems
Моя первая проблема заключается в том, что я заметил, что вызов метода «унаследованный» в сущности, являющейся типом подкласса, вместо этого вызывает версию родительского полимоделиста этого метода, которая является просто «проходом». Таким образом, метод возвращает None и все испортит.
EDIT: Похоже, что это касается не только вызова метода, но и всех его свойств. Когда я пытаюсь зарегистрировать некоторую конкретную информацию, которую имеет подкласс, но родительский нет, она выдает ошибку, говорящую, что она не может найти эту информацию.
например.
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'
. Мой класс на самом деле не называется «Родитель», я просто хотел придерживаться моего предыдущего примера.
Все это очень расстраивает, и я действительно не знаю, как действовать дальше. Любая помощь ценится!
EDIT
Вот, пожалуй, более подробное описание того, что происходит:
Я определил PolyModel класс, который я не хочу, чтобы создать экземпляр; Я только хочу, чтобы он служил классом шаблона. У него есть шаблонные методы, которые я хочу определить во всех его дочерних элементах; все это 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, в том же каталоге, что и основная модель файл, я определил расширение модели шаблона, которая заполняет это методы с реальная логика.
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, которые указывают на «Шаблон». Надежда/предположение заключается в том, что это будет действовать как другие модели наследования, и поэтому, когда мы вытаскиваем из хранилища данных объект типа/подтипа «Шаблон», мы можем назвать его 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, что вызывает тонны ошибок. Поскольку это не происходит каждый раз, я не уверен, с чего начать поиск проблемы.
Для вашей первой проблемы, предоставить код, который не работает - только модели не очень помогает. Документация, с которой вы связаны, очень старая и относится к пакету «db», а не ndb. Принципы работы PolyModel все еще применяются, но особенности кода различны. – Greg
Я бы предложил в соответствии с предыдущими комментариями вы покажете код, вызывающий методы в дополнение к определениям классов. Я использую Polymodel широко (в db и ndb) в течение многих лет, и он работает как ожидается, наследует. –
@TimHoffman - я не могу показать фактический код, потому что это действительно большая база кода, и проблема распространяется, и потому что я не хочу раскрывать конфиденциальную информацию о архитектуре моей компании. Я написал нечто более общее, но попытался дать много подробностей. Как вы думаете? – bgenchel