Question

Je ne parviens pas à comprendre comment obtenir des objets à partir du magasin de données Google App Engine à l'aide de get_by_id. Voici le modèle

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)

Je peux les créer, les mettre et les récupérer avec 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()

Une adresse enregistrée a des valeurs pour

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

Je peux les trouver en utilisant la clé

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

Mais vous ne pouvez pas les trouver par identifiant

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

L'adresse est Aucune, lorsque j'essaie

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

Comment trouver un identifiant?

EDIT: Il s’avère que je suis un idiot et que j’essayais de trouver un modèle d’adresse dans une fonction appelée Address. Merci pour vos réponses, j’ai marqué Brandon comme étant la bonne réponse car il est arrivé le premier et a démontré que cela devrait fonctionner.

Était-ce utile?

La solution

Je viens de l'essayer sur shell.appspot.com et il semble que fonctionne 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>

Autres conseils

La clé d'une application est une liste de tuples (type, id_ou_nom) - pour les entités racine, toujours un seul élément long. Ainsi, un ID seul n'identifie pas une entité - le type d'entité est également requis. Lorsque vous appelez db.Model.get_by_id (x), vous demandez l'entité avec la clé (Model, x). Ce que vous voulez, c'est appeler Address.get_by_id (x), qui va chercher l'entité avec la clé (Address, x).

Vous devez utiliser un type long dans get_by_id ("ici"). Le type Int doit avoir un message d'erreur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top