【问题标题】:NDB PolyModel ProblemsNDB PolyModel 问题
【发布时间】: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


【解决方案1】:

它被称为_class_name(),带有一个前导下划线。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    相关资源
    最近更新 更多