Метод get_by_id для классов моделей в хранилище данных Google App Engine

StackOverflow https://stackoverflow.com/questions/649284

Вопрос

Я не могу понять, как получить объекты из хранилища данных Google App Engine с помощью get_by_id. Вот модель

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')

Но не могу найти их по идентификатору

>> 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'

Как я могу найти по идентификатору?

РЕДАКТИРОВАТЬ: Оказывается, я идиот и пытался найти модель адреса в функции с именем Address. Спасибо за ваши ответы, я пометил Брэндона как правильный ответ, так как он вошел первым и продемонстрировал, что все должно работать.

Это было полезно?

Решение

Я только что попробовал его на 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>

Другие советы

Ключ приложения - это список (kind, id_or_name) кортежей - для корневых сущностей всегда только один элемент длиной. Таким образом, один только идентификатор не идентифицирует сущность - также требуется тип сущности. Когда вы вызываете db.Model.get_by_id (x), вы запрашиваете сущность с ключом (Model, x). Вам нужно вызвать Address.get_by_id (x), который выбирает объект с ключом (Address, x).

Вы должны использовать длинный тип в get_by_id (" здесь "). Тип int должен содержать сообщение об ошибке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top