我正在开发一个谷歌应用引擎应用程序,我们在其中使用 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类,这会导致大量错误。由于这种情况并非每次都发生,因此我不确定从哪里开始寻找问题。