Pergunta

Eu sou incapaz de treino como você pode obter objetos do Google App Engine Datastore usando get_by_id. Aqui é o 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)

Eu posso criá-los, colocá-los e recuperá-los com 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()

A salvo endereço tem valores para

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

Eu posso encontrá-los usando a tecla

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

Mas não pode encontrá-los por id

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

O endereço é Nenhuma, quando tento

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

Como posso encontrar por id?

EDIT: Acontece que eu sou um idiota e estava tentando encontrar um modelo de endereço em uma função chamada endereços. Obrigado por suas respostas, eu marquei Brandon como a resposta correta quando ele entrou primeiro e demonstrou que deveria todo o trabalho.

Foi útil?

Solução

Eu apenas tentei em shell.appspot.com e parece funcionar bem:

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>

Outras dicas

chave de um aplicativo é uma lista de (tipo, id_or_name) tuplas - para entidades de raiz, sempre apenas um elemento muito tempo. Assim, um ID sozinho não identifica uma entidade - o tipo de entidade também é necessária. Quando você chama db.Model.get_by_id (x), você está pedindo para a entidade com chave (Model, x). O que você quer é chamar Address.get_by_id (x), que busca a entidade com chave (Endereço, x).

Você deve usar tipo longo em get_by_id ( "aqui"). tipo int deve ter uma mensagem de erro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top