2013-02-18 3 views
10

これはGoogle App Engineのndbに関するものです。私の所見によると、キーを提供せずにエンティティを作成すると、Datastore Viewerに表示されているIDフィールドにエンティティの整数が1から始まりインクリメンタルになります。しかし、idとして文字列を指定してエンティティを作成すると、エンティティの文字列はKey Nameフィールドになります。たとえば、次のようにGoogle App Engineのndb:IDまたはキー名を使用していますか?

モデル:

class Member(ndb.Model): 
    ... 

プログラム:

member1 = Member()   # --> ID is 1, Key Name is None 
member2 = Member(id='abc') # --> ID is empty, Key Name is 'abc' 

また、htmlファイルで、私はに戻るには、パラメータとして

<input ... name="id" value={{member1.key.id}} ... /> 

を使用している場合サーバーサイドプログラム(Python)では、member1には次の2つのステートメントのどれも動作しません:

しかし
Member.get_by_id(self.request.get('id')) 
member1 = Member.get_by_id(int(self.request.get('id'))) 

、次のHTMLやプログラムコード:

<input ... name="id" value={{member2.key.id}} ... /> 
member2 = Member.get_by_id(self.request.get('id')) 

はmember2のために動作します。

文字列ID(member2)を指定して作成したエンティティには問題はありません。しかし、同じことはメンバー1にとっては機能しません。私の質問:a)私の観察は正しいのですか? b)get_by_id()を使用してmember1を取得するにはどうすればよいですか?

+0

あなたはすべてのメンバーをフェッチし、その鍵を検討してきましたあなたが実際にmember1とmember2を書いたことを知っていますか? と –

+0

2.あなたが実際に作成したキー –

答えて

13

a)あなたが示した2番目の方法でmember1を取得できるはずですが、ほとんど正しいです。また、整数IDは常に1から始まり、常に増分であることを検証できません。私はそれに関して混在した結果を見た。

B)member1 = Member.get_by_id(int(self.request.get('id')))

を動作するはずですあなたはまた、あなたがキーIDの変換を心配する必要はいけないkey.urlsafe()を使用して試みることができる:

<input ... name="id" value={{member.key.urlsafe()}} ... />

member_key = self.request.get('id') 
member = ndb.Key(urlsafe=member_key).get() 
+3

私の観察の一部を確認していただきありがとうございます。より多くの実験の後、私は以下の結論を得た。エンティティがidなしで作成された場合(例えば、 'member1 = Member()')、そのIDは整数であり、 'member1 = Member.get_by_id(int(self.request.get( 'id')) ) '。しかし、エンティティがid(例えば 'member2 = Member(id = 'abc')')で作成された場合、そのキー名は 'abc'であり、 'member2 = Member.get_by_id(self .request.get( 'id')) '。どちらもHTMLの同じテンプレート変数を使用します: '{{member1.key.id}}と{{member2.key.id}} ' –

+0

long numberをallocate_idからintに変換するのは安全ですか?または、変換で整数を切り捨てることは可能でしょうか? – ccsakuweb

+0

+1のurlsafeの提案は、私の問題を修正! :) –

関連する問題