0

我正在开发一个谷歌应用引擎应用程序,我们在其中使用 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'. 我的班级实际上并没有被称为“父母”,我只是想与我之前的例子保持一致。

这一切都非常令人沮丧,我真的不知道如何进行。任何帮助表示赞赏!

编辑

以下可能是对正在发生的事情的更详细描述:

我已经定义了一个不想实例化的 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 将运行。IE

 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)

这是我的问题发生的地方。我们从未真正使用过模板;对于“OtherThing”的每个实例,我们实际上是在分配一个 TemplateExtension 实例。然而,随机,不是每次,在OtherThing的方法(我实际代码中几个地方的概括)中提取模板后,我看到调用的是Template父类的方法而不是TemplateExtension类,这会导致大量错误。由于这种情况并非每次都发生,因此我不确定从哪里开始寻找问题。

4

1 回答 1

2

_class_name()它使用前导下划线调用。

https://cloud.google.com/appengine/docs/python/ndb/polymodelclass

于 2016-03-14T19:52:58.133 回答