2010-02-07 18 views
6

Al usar el SDK de Google App Engine y Python, tengo un problema: no puedo acceder a la propiedad de ID de las propiedades de una entidad determinada. Las únicas propiedades que pueden tener acceso son los que se definen en mi modelo de clase, además de la propiedad clave (véase la respuesta más abajo):No se puede acceder a la propiedad de ID de una entidad del almacén de datos

class Question(db.Model): 
    text = db.StringProperty() 
    answers = db.StringListProperty() 
    user = db.UserProperty() 
    datetime = db.DateTimeProperty() 

puedo tener acceso a texto, respuestas, usuario, fecha y hora y propiedades clave bien. Sin embargo, no puedo acceder a la propiedad de ID. Por ejemplo, después de ir a buscar todas las entidades (usando Question.all()):

# OK Within a template, this will return a string : 
{{ question.text }} 
# OK, this will return the entity key : 
{{ question.key }} 

# KO this will return nothing : 
{{ question.id }} 

¿Alguna idea? Gracias !

+0

La clave y el ID no son propiedades de una entidad del almacén de datos. key() es un método de instancia e id() es un método de instancia de la clave. {{entity.key.id}} solo funciona porque el bit después de. se interpretará como una llamada al método cuando corresponda. – geoffspear

Respuesta

10

De acuerdo con documentation, no hay ningún método de instancia id() definido para las subclases del modelo.

Pruebe {{ question.key }} en su lugar.

También tenga en cuenta que la clave no se crea hasta que la entidad se guarda en el almacén de datos.


Editar: más información sobre la base de edición de OP:

Ya que estamos realmente después de la ID numérico, que podría hacer algo como esto en nuestra plantilla:

{{ question.key.id }}

Otra nota: nunca se debe esperar que los ID numéricos aumenten en el valor correspondiente al orden de creación de la entidad. En la práctica, esto suele ser, pero no siempre, el caso.

+0

De hecho, {{question.key}} funciona bien y devuelve la clave almacenada en el almacén de datos. Debería haber verificado dos veces! Podría editar mi publicación original. Así que supongo que recuperar el ID es lo único que queda. – jbmusso

+0

gracias por las respuestas rápidas, resolvió mis problemas perfectamente! – jbmusso

+0

@Sorw: En cualquier momento. Bienvenido a SO. – bernie

5

Acabo de encontrar una solución posible (poco elegante, IMO). Después de consultar y ir a buscar entidades, bucle a través de todos ellos y añadir manualmente el parámetro id:

query = Question.all() 
questions = query.fetch(10) 

# Add ID property : 
for question in questions: 
    question.id = str(question.key().id()) 

no creo que es la CPU eficiente sabia, pero funciona como una solución rápida/sucio.

+0

@Sorw: no tiene que hacer esto. Ver mi respuesta editada. – bernie

+0

@ Adam: jeje Creo que ambos encontramos una posible solución al mismo tiempo, pero la tuya es mucho más simple. – jbmusso

+0

Inelegante, quizás, pero +1 a usted por llegar a una solución. – bernie

Cuestiones relacionadas