6

我无法了解如何使用 get_by_id 从 Google App Engine Datastore 获取对象。这是模型

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)

地址是无,当我尝试

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

我如何通过 id 找到?

编辑:原来我是个白痴,并试图在一个名为 Address 的函数中找到一个地址模型。感谢您的回答,我已将布兰登标记为正确答案,因为他首先进入并证明它应该一切正常。

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) 元组的列表 - 对于根实体,始终只有一个元素长。因此,单独的 ID 并不能识别实体 - 实体的类型也是必需的。当您调用 db.Model.get_by_id(x) 时,您正在请求具有键 (Model, x) 的实体。您想要的是调用 Address.get_by_id(x),它使用键 (Address, x) 获取实体。

于 2009-03-16T11:24:15.887 回答
0

您应该在 get_by_id("here") 中使用长类型。Int 类型必须有错误信息。

于 2010-12-25T14:47:05.093 回答