Pregunta

No puedo entrenar cómo puede obtener objetos del almacén de datos de Google App Engine usando get_by_id. Aquí está el modelo

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)

Puedo crearlos, ponerlos y recuperarlos con 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()

Una dirección guardada tiene valores para

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

Puedo encontrarlos usando la tecla

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

Pero no puedo encontrarlos por id

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

La dirección es Ninguna, cuando lo intento

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

¿Cómo puedo encontrar por id?

EDITAR: Resulta que soy un idiota e intentaba encontrar un Modelo de Dirección en una función llamada Dirección. Gracias por sus respuestas, marqué a Brandon como la respuesta correcta cuando entró primero y demostré que todo debería funcionar.

¿Fue útil?

Solución

Acabo de probarlo en shell.appspot.com y parece que funciona bien:

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>

Otros consejos

La clave de una aplicación es una lista de tuplas (kind, id_or_name), para entidades raíz, siempre de un solo elemento. Por lo tanto, una ID por sí sola no identifica una entidad; también se requiere el tipo de entidad. Cuando llamas a db.Model.get_by_id (x), estás preguntando por la entidad con clave (Modelo, x). Lo que desea es llamar a Address.get_by_id (x), que obtiene la entidad con la clave (Dirección, x).

Debería usar el tipo largo en get_by_id (" here "). El tipo int debe tener un mensaje de error.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top