0

Я работаю над приложением 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, что вызывает тонны ошибок. Поскольку это не происходит каждый раз, я не уверен, с чего начать поиск проблемы.

+1

Для вашей первой проблемы, предоставить код, который не работает - только модели не очень помогает. Документация, с которой вы связаны, очень старая и относится к пакету «db», а не ndb. Принципы работы PolyModel все еще применяются, но особенности кода различны. – Greg

+0

Я бы предложил в соответствии с предыдущими комментариями вы покажете код, вызывающий методы в дополнение к определениям классов. Я использую Polymodel широко (в db и ndb) в течение многих лет, и он работает как ожидается, наследует. –

+0

@TimHoffman - я не могу показать фактический код, потому что это действительно большая база кода, и проблема распространяется, и потому что я не хочу раскрывать конфиденциальную информацию о архитектуре моей компании. Я написал нечто более общее, но попытался дать много подробностей. Как вы думаете? – bgenchel

ответ