0

私は、ポリモデルを使用してエンティティのサブセットを表現する Google App Engine アプリに取り組んでいます。ただし、ドキュメントが機能すると主張している方法で使用するのに問題があります。

私の最初の問題は、サブクラスのタイプであるエンティティの「継承された」メソッドの呼び出しが、代わりにそのメソッドの親ポリモデルのバージョンを呼び出していることに気付いたことです。これは単なる「パス」です。したがって、メソッドは None を返し、すべてを台無しにします。

編集:これは、メソッド呼び出しだけでなく、そのすべてのプロパティに当てはまるようです。サブクラスにはあるが親にはない特定の情報をログに記録しようとすると、その情報が見つからないというエラーがスローされます。

例えば

class Parent(polymodel.PolyModel):
    def someMethod(self, params):
        pass

class Child(Parent):
    def someMethod(self, params):
        {{logic}}
        return something

最初の問題を解決しようとした結果、私が見つけた 2 番目の問題は、https: //cloud.google.com/appengine/articles/polymodelに存在すると報告されている 'class_name()' メソッドが動作しないようです。

呼び出すと、.で終わるサーバー エラーが発生します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 と呼びましょう。メイン モデル ファイルと同じディレクトリにあり、メソッドに実際のロジックを設定する Template モデルの拡張を定義しました。

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 のメソッド (実際のコードのいくつかの場所の一般化) でテンプレートを引き出した後、TemplateExtension クラスの代わりに Template 親クラスのメソッドが呼び出されていることがわかります。エラー。これは毎回発生するわけではないため、どこから問題を探し始めればよいかわかりません。

4

1 に答える 1

2

_class_name()先頭にアンダースコアを付けて呼び出されます。

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

于 2016-03-14T19:52:58.133 に答える