NDB PolyModel问题

时间:2016-03-13 23:58:45

标签: python google-app-engine google-cloud-datastore app-engine-ndb polymodel

我正在使用谷歌应用引擎应用,我们使用polymodel来表达实体的子集。我在使用文档声称它有效的方式时遇到了问题。

我的第一个问题是,我注意到对作为子类类型的实体的'继承'方法的调用是调用该方法的父多态模型的版本,这只是一个'传递'。因此,该方法返回None并将一切都搞砸了。

编辑: 似乎这不仅适用于方法调用,而且适用于所有属性。当我尝试记录子类具有但父节点没有的某些特定信息时,会抛出错误,表示无法找到该信息。

e.g。

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'结尾的服务器错误。我的班级实际上并没有被称为“家长”,我只是想与我之前的例子保持一致。

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

修改

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

我已经定义了一个我不想实例化的multiodel类;我只希望它作为模板类。它有模板方法,我希望在它的所有孩子中定义;都是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
       """

回到主模型文件中,我们有某些类具有指向'Template'的ndb.KeyProperties。希望/假设是这将像其他继承模型一样,因此当我们从数据存储区中提取类型/子类型为“模板”的实体时,我们可以调用它的method_one()和method_two()以及该特定的代码。 instance的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的方法(我实际代码中的几个地方的概括)中拉出模板后,随机地不是每次都,我看到调用模板父类的方法而不是TemplateExtension类,这会导致大量错误。由于这不是每次都发生,我不知道从哪里开始寻找问题。

1 个答案:

答案 0 :(得分:2)

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

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