9

Google App Engine の ndb についてです。私の観察によると、キーを指定せずにエンティティを作成すると、IDDatastore Viewer に示されているように、エンティティのフィールドには 1 から始まり増分する整数が含まれます。ただし、id として文字列を指定してエンティティを作成すると、エンティティのKey Nameフィールドに文字列が含まれます。例えば:

モデル:

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) に返すパラメーターとして、次の 2 つのステートメントのいずれも member1 に対して機能しません。

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) を指定して作成されたエンティティには問題がないようです。しかし、同じことは member1 では機能しません。私の質問: a) 私の観察は正しいですか? b) を使用して member1 を取得するにはどうすればよいget_by_id()ですか?

4

1 に答える 1

13

member1a) おおむね正しいですが、2 番目に示した方法を実行できるはずです。また、整数 ID が常に 1 から始まり、常に増分されることを確認できません。それに関しては、さまざまな結果が見られました。

b)member1 = Member.get_by_id(int(self.request.get('id')))動作するはずです

key.urlsafe()キーIDの変換について心配する必要がないように、次を使用することもできます。

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

member_key = self.request.get('id')
member = ndb.Key(urlsafe=member_key).get()
于 2013-02-18T14:40:57.460 に答える