【发布时间】:2016-12-29 00:25:13
【问题描述】:
我正在开发一个谷歌应用引擎应用,我们在其中使用 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,在与主模型文件相同的目录中,我定义了模板模型的扩展,它使用真实逻辑填充它的方法。
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)
这是我的问题发生的地方。我们从未真正使用过模板;对于“OtherThing”的每个实例,我们实际上是在分配一个 TemplateExtension 实例。然而,随机地,不是每次,在 OtherThing 的方法(我的实际代码中的几个地方的概括)中提取模板后,我看到调用的是 Template 父类的方法而不是 TemplateExtension类,这会导致大量错误。由于这种情况并非每次都发生,因此我不确定从哪里开始寻找问题。
【问题讨论】:
-
对于您的第一个问题,请提供不起作用的代码 - 只是模型没有多大帮助。您链接到的文档非常旧,并且指的是“db”包,而不是 ndb。 PolyModel 的工作原理仍然适用,但代码细节有所不同。
-
我建议按照之前的 cmets,除了类定义之外,您还可以显示调用方法的代码。多年来,我广泛使用 Polymodel(在 db 和 ndb 中),它按预期的方式工作。
-
@TimHoffman - 我无法展示实际代码,因为它是一个非常大的代码库并且问题已经蔓延开来,而且我不想透露有关我公司架构的敏感信息。我在上面写了一些更笼统的东西,但试图给出很多细节。你怎么看?
-
嗯,你需要做一些基本的调试。在检索实体时尝试记录类。也许您正在检索父类实例。
-
根据我已经完成的日志记录,它是我想要的类的实例,但它被“视为”它的 polymodel 父级的实例。例如,实例上的函数调用调用它的父方法,这些方法大多是“通过”。
标签: python google-app-engine google-cloud-datastore app-engine-ndb polymodel