2010-11-29 16 views
5

私はget_or_insert(..)で混乱しています。 key_nameとして何を渡す必要がありますか?次の例を考えてみましょう。Google App Engine - Datastore get_or_insert key_nameの混乱

class Person(db.model) 
    name = db.StringProperty(required=True) 

同じ名前を持つ人は2人いないとします。私がPeterという名前の新しいPersonを入手したいのですが、私のget_or_insertのステートメントはどんなものですか?

乾杯、

ピート

+0

宣言されたdb.StringPropertyの名前はkey_nameとは何の関係もありません。 – systempuntoout

答えて

5

は、ここでは、おそらく混乱を招く事はあなたの例ではname = db.StringPropertyビットが必要とされないように鍵は、あなたのモデル宣言で直接表示されないということです。 get_or_insertは、その最初の引数(必須)としてキー名を取りますので、あなたのようなコードを探している:あなたは主キーのようkey_nameと考えることができます

person = Person.get_or_insert('Peter') 
# other interesting & useful code here... 
# later, maybe we need to retrieve that key name from the object: 
name = person.key().name() 
assert(name == "Peter") 
+0

これは私のモデルでは上記のように動作しますか? – Peter

+0

はい、ここで設定されているキー名は、エンティティ本体内の変更可能なプロパティではなく、エンティティの永続的な一意の識別子です。上記の例では、モデル宣言の "name"プロパティは使用されていません。 –

+0

エラーが発生しました。TypeError: 'Key'オブジェクトが呼び出せません – ericso

1

get_or_insert(...)のドキュメントを見ると、バックエンドコードの例があります。

名前が一意のフィールドの場合、その名前をキー名として使用することもできます。ホワイトスペースを取り除き、ケースを正規化することをお勧めしますが。