Método get_by_id en clases de modelo en el almacén de datos de Google App Engine
-
19-08-2019 - |
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.
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.