google.appengine.ext.ndb.msgprop モジュール

概要

MessageProperty - ProtoRPC Message オブジェクトを格納するプロパティ。

基本的な使用法:

以下のような protorpc.messages.Message サブクラスがあるとします。

from protorpc import messages

class Note(messages.Message):

text = messages.StringField(1, required=True) when = messages.IntegerField(2)

ここで、Cloud Datastore にメモを格納するとします。次のようにメモを保持するモデルクラスを作成します。

from google.appengine.ext import ndb from google.appengine.ext.ndb import msgprop

class NoteStore(ndb.Model):

note = msgprop.MessageProperty(Note) name = ndb.StringProperty()

(クラス名「NoteStore」、プロパティ名「note」は任意の名前です。)

メモメッセージを格納するには、NoteStore エンティティを作成して次のように記述します。

ns = NoteStore(note=my_note, name=’foo’) key = ns.put()

後でメモを取得するには、NoteStore エンティティを読み戻します。

ns = key.get() my_note = ns.note

MessageProperty クラスには一般的なプロパティ オプションが多く含まれます。
  • name: オプションのデータストア名

  • repeated: True の場合、メッセージ値のリストを格納します。

  • required: True の場合、メッセージ値を None にすることはできません。

  • default: 格納するデフォルト メッセージ値(オプション)

  • choices: 許容される選択肢のオプション リスト(すべてがメッセージでなければなりません)

  • validator: メッセージ値を検証するための機能(オプション)

  • verbose_name: プロパティの長い名前(オプション)

ただし、MessageProperty では「indexed」オプションはサポートされません。次のように、インデックス登録されるフィールド名リストを代わりに指定できます。

class MyStore(ndb.Model):

author = ndb.StringProperty() note = msgprop.MessageProperty(Note, indexed_fields=[‘text’, ‘when’])

ここで、次のようにフィールド値を照会できます。

stores = MyStore.query(MyStore.note.when >= 123).fetch()

StructuredProperty と似ている点に注目してください。事実、MessageProperty は StructuredProperty から継承されています。主な相違点は、StructuredProperty が protorpc.messages.Message サブクラスではなく Model サブクラスを利用する点です。デフォルトの場合、StructuredProperty ではどのフィールドもインデックスに登録されません。

これは次のような(MessageField を使用する)ネストされたメッセージでも機能します。

class Notes(messages.Message):

notes = messages.MessageField(Note, 1, repeated=True)

class MyNotesStore(ndb.Model):

author = ndb.StringProperty() foo = msgprop.MessageProperty(Notes,

indexed_fields=[‘notes.text, ‘notes.when’])

indexed_fields のこの値を指定すると、次の例でサブフィールドも照会できます。

stores = MyNoteStore.query(MyNoteStore.foo.notes.when < 123).fetch()

MessageProperty の最後のオプションは「protocol」です。このオプションを使用すると、メッセージ オブジェクトを Cloud Datastore にシリアル化する方法を指定できます。値は、protorpc.remote.Protocols クラスによって使用されるプロトコル名です。サポートされているプロトコル名は「protobuf」と「protojson」であり、デフォルトは「protobuf」です。(将来、このオプションには protorpc に追加予定のグローバル プロトコル レジストリが使用されます。これにより、どの登録済みプロトコル名も受け入れられるようになります)。

EnumProperty もあります。これを使用すると、messages.Enum 値を Message オブジェクト内にラップせずに格納できます。次に例を示します。

class Color(messages.Enum):

RED = 620 GREEN = 495 BLUE = 450

class Part(ndb.Model):

name = ndb.StringProperty() color = msgprop.EnumProperty(Color, required=True)

p1 = Part(name=’foo’, color=Color.RED) key1 = p1.put() … p2 = key1.get() print p2.name, p2.color # prints “foo RED”

EnumProperty では値が整数として格納されます。事実、EnumProperty は IntegerProperty のサブクラスです。これを知っておくと便利です。列挙値は格納済みのエンティティを変更せずに名前を変更できますが、番号の付け直しはできないことがわかるためです。

EnumProperty は以下の標準オプションをサポートしています。
  • name

  • indexed

  • repeated

  • required

  • default

  • choices

  • validator

  • verbose_name

内容

クラス google.appengine.ext.ndb.msgprop。MessageProperty(*args, **kwds)ソース

ベース: google.appengine.ext.ndb.model.StructuredProperty

Cloud Datastore ではメッセージは構造化プロパティとして表されます。

デフォルトでは、構造化プロパティにはシリアル化されたメッセージを含む単一のサブプロパティがあります。このプロパティの名前は Python では「blob_」ですが、Datastore では __<protocol>__です。<protocol> はプロトコル引数の値です(デフォルトは「protobuf」)。

クラス google.appengine.ext.ndb.msgprop。EnumProperty(*args, **kwds)ソース

ベース: google.appengine.ext.ndb.model.IntegerProperty

Cloud Datastore では列挙値は整数として表されます。

これは Datastore ビューアではあまり扱いやすくありませんが、protobuf シリアル化での列挙値と同じ表現を使用していて(ただし、JSON の場合とは異なります)、データストアに格納済みの値を変更せずに列挙値の名前を変更できます。

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

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

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