google.appengine.ext.db.polymodel モジュール

概要

ポリモーフィック モデルおよびクエリのサポート。

Model クラスはそれ自体、機能的ポリモーフィックをサポートすることしかできません。Model のサブクラスを作成し、世代を必要な数だけサブクラス化できます。それらのクラスはまったく同じプロパティおよび動作を共有します。このように Model をサブクラス化すると、各サブクラスがそれぞれの Kind に配置されるということが問題となります。つまり、ポリモーフィック クエリを実行できません。基本クラスのクエリを作成すると、そのクラスのインスタンスはデータストアから返されるだけで、サブクラスのクエリはそれらのインスタンスのみを返します。

このモジュールを使用すると、アプリケーションはポリモーフィック クエリをサポートするクラス階層を指定できます。

内容

class google.appengine.ext.db.polymodel.PolyModel(parent=None, key_name=None, _app=None, _from_entity=False, **kwds)ソース

ベース: google.appengine.ext.db.Model

ポリモーフィック クエリをサポートするモデルの基本クラス。

このクラスを使用して、型に基づくクエリを実行できる階層を構築します。

次のようなモデル階層が考えられます。

Animal

+——+ +——+ |Canine||Feline| +——+ +——+

|

+——-+ +——-+ | | | |

+—+ +—-+ +—+ +——-+ |Dog||Wolf||Cat||Panther| +—+ +—-+ +—+ +——-+

このクラス階層は 3 つのレベルで構成されています。最初の階層は「ルートクラス」です。1 つのクラス階層内のすべてのモデルは、このルートから継承する必要があります。階層内のモデルはすべて、ルートクラスと同じ種類として保存されます。例えば、データストアに保存されるとき、Panther エンティティの種類は「Animal」です。Animal の種類に対してクエリを実行すると、クエリに一致する Cats、Dogs、Canines などが検索されます。ルートクラスの種類に保存されているさまざまなクラスは、そのクラスキーによって識別されます。データストアからロードされると、適切な実装クラスにマッピングされます。

ポリモーフィック プロパティ:

階層内の特定の基本クラスに定義されているプロパティは、すべてのサブキャスのデータストアのみに保存されています。つまり、Feline クラスに「whiskers」というプロパティがある場合、このプロパティは Cat および Panther エンティティにはありますが、Animal、Canine、Dog、Wolf にはありません。

ポリモーフィック クエリ:

ポリモーフィック オブジェクトがデータストアに書き込まれると、そのようなオブジェクトにはすべて、クエリ対象にできる「class」というプロパティが自動的に設定されます。このプロパティを使用すると、あらゆるサブ階層に対して GQL クエリを簡単に作成できます。たとえば、すべての Dog と Wolf を含む Canine オブジェクトのみをフェッチする方法は次のとおりです。

db.GqlQuery(“SELECT * FROM Animal WHERE class=’Canine’”)

Canine クラスの「all」メソッドか「gql」メソッドを使っても構いません。

Canine.all() Canine.gql(‘’)

「class」プロパティは、クエリ以外のコードでは使用されません。このプロパティは実際の Python クラスを表すことになっているため、表示されないようになっています。

ルートクラス:

ルートクラスは、階層の他のすべてのクラスが継承するクラスです。階層ごとに 1 つのルートクラスがあります。クラスが PolyModel の直下の子である場合、そのクラスはルートクラスです。ルートクラスのサブクラスは、ルートクラスとすべて同じ種類です。つまり、次のようになります。

Animal.kind() == Feline.kind() == Panther.kind() == ‘Animal’

classmethod all(**kwds)ソース

クラス階層のすべてのインスタンスを取得します。

パラメータ

kwds - Model.all に渡されるキーワード パラメータ。

戻り値

このクラスの弁別子に一致するようにフィルタを設定してクエリを実行します。

classmethod class_key()ソース

このクラスのクラスキーを計算します。

戻り値

クラスのクラスキー。デフォルトでは、これは階層のクラスのリストであり、ルートクラスから始まり、cls へと向かいます。

classmethod class_name()ソース

このクラスのクラス名を計算します。

クラスキー内の各クラス要素に使用する名前を返します。クラス階層のデータストアの種類に存在するさまざまなクラスを区別するために使用します。

このメソッドにより、デベロッパーは Python コードで使用されているものとは異なるクラス名をデータストアで使用できます。これは、たとえば、すでにデータストアに書き込まれたインスタンスを移行しないでクラスの名前を変更する場合などに便利です。ポリモーフィック クラス Contact の名前を SimpleContact へ変更するには、次のように変換します。

# クラスキーは [‘Information’] class Information(PolyModel): …

# クラスキーは [‘Information’, ‘Contact’] class Contact(Information): …

次のように変更します。

# クラスキーは依然として [‘Information’, ‘Contact’] class SimpleContact(Information):

… @classmethod def class_name(cls):

return ‘Contact’

# クラスキーは [‘Information’, ‘Contact’, ‘ExtendedContact’] class ExtendedContact(SimpleContact): …

これにより、古いクラス名を使用して以前に書き込まれたすべてのオブジェクトが確実に読み込まれます。

戻り値

このクラスの名前。

classmethod from_entity(entity)ソース

弁別子に基づいてエンティティからクラスに読み込みます。

種類マッピングに基づいて新しい Model インスタンスをインスタンス化するのではなく、エンティティ クラスキーに基づいて正しいモデルクラスのインスタンスが作成されます。

パラメータ

entity - データストアから直接読み込まれたエンティティ。

発生するエラー

KindError、弁別子に基づくクラス マッピングがない場合。

classmethod gql(query_string, *args, **kwds)ソース

GQL クエリ文字列を使用して、ポリモーフィック クエリを返します。

このクエリは、モデルのインスタンスまたはモデルのサブクラスのインスタンスを取得するようフィルタが設定されている点でポリモーフィックです。

パラメータ
  • query_string - 'SELECT * FROM <entity>' 部分が省略され、適切にフォーマットされた GQL クエリ文字列

  • * args - クエリ内の数値参照をバインドするために使用される残りの場所引数。

  • ** kwds - 辞書ベースの引数(名前付きパラメータの場合)。

classmethod kind()ソース

ポリモーフィック モデルの種類を取得します。

ルートクラスのすべてのサブクラスがルートと同じ種類になるようにオーバーライドされます。

戻り値

データストアに書き込むエンティティの種類。

class google.appengine.ext.db.polymodel.PolymorphicClass(name, bases, dct)ソース

ベース: google.appengine.ext.db.PropertiedClass

PolymorphicClasses を初期化するためのメタクラス。

このクラスは PropertiesiedClass を拡張し、正しく機能するよう新しいポリモーフィック クラスにいくつかの静的属性を追加します。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Python の App Engine スタンダード環境