6

get_by_id を使用して Google App Engine データストアからオブジェクトを取得する方法がわかりません。モデルはこちら

from google.appengine.ext import db

class Address(db.Model):
  description = db.StringProperty(multiline=True)
  latitude = db.FloatProperty()
  longitdue = db.FloatProperty()
  date = db.DateTimeProperty(auto_now_add=True)

gql を使用して、それらを作成、配置、および取得できます。

address = Address()
address.description = self.request.get('name')
address.latitude = float(self.request.get('latitude'))
address.longitude = float(self.request.get('longitude'))
address.put()

保存された住所には次の値があります

>> address.key()
aglndWVzdGJvb2tyDQsSB0FkZHJlc3MYDQw
>> address.key().id()
14

キーを使用してそれらを見つけることができます

from google.appengine.ext import db
address = db.get('aglndWVzdGJvb2tyDQsSB0FkZHJlc3MYDQw')

しかし、IDでそれらを見つけることができません

>> from google.appengine.ext import db
>> address = db.Model.get_by_id(14)

試してみると、アドレスはNoneです

>> Address.get_by_id(14)
AttributeError: type object 'Address' has no attribute 'get_by_id'

どうすればIDで検索できますか?

編集: 私は馬鹿で、Address という関数で Address Model を見つけようとしていたことがわかりました。ご回答ありがとうございます。Brandon が最初に参加し、すべてが機能することを実証したので、Brandon を正解としてマークしました。

4

3 に答える 3

21

私はそれを試してみましたがshell.appspot.com、うまくいくようです:

Google Apphosting/1.0
Python 2.5.2 (r252:60911, Feb 25 2009, 11:04:42) 
[GCC 4.1.0]

>>> class Address(db.Model):
  description = db.StringProperty(multiline=True)
  latitude = db.FloatProperty()
  longitdue = db.FloatProperty()
  date = db.DateTimeProperty(auto_now_add=True)

>>> addy = Address()
>>> addyput = addy.put()
>>> addyput.id()
136522L
>>> Address.get_by_id(136522)
<__main__.Address object at 0xa6b33ae3bf436250>
于 2009-03-16T05:45:36.950 に答える
6

アプリのキーは、(kind, id_or_name) タプルのリストです。ルート エンティティの場合、常に 1 つの要素の長さだけです。したがって、ID だけではエンティティを識別できません。エンティティのタイプも必要です。db.Model.get_by_id(x) を呼び出すと、キー (Model, x) を持つエンティティが要求されます。必要なのは、キー (Address, x) を持つエンティティをフェッチする Address.get_by_id(x) を呼び出すことです。

于 2009-03-16T11:24:15.887 に答える
0

get_by_id("here") では long 型を使用する必要があります。Int 型にはエラー メッセージが必要です。

于 2010-12-25T14:47:05.093 に答える