2012-04-05 15 views
8

Estoy intentando cargar una entidad por clave utilizando el id. Que el almacén de datos asignó, pero no veo ningún método api para hacerlo (usando NDB). Pensé que sería capaz de hacer una clave a partir de una identificación entera y usar key.get() para cargar la entidad, pero no veo una manera de hacer una clave solo con una identificación. Sospecho que me estoy perdiendo algo obvio aquí. ¿Cómo debo cargar una entidad donde solo conozco su id?motor de aplicación ndb - cómo cargar entidad por clave usando id?

Respuesta

23

YourModel.get_by_id() obtiene una instancia de modelo por id.

aquí los documentos:
https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_get_by_id

no creo que no se puede conseguir una entidad por id sin conocer el tipo, ya instancias de las diferentes clases del modelo pueden tener el mismo id/nombre_tecla

+0

Gracias, eso es exactamente lo que estaba buscando. No estoy seguro de cómo me perdí eso en los documentos. – user605331

+2

Creo que los documentos son incorrectos, no pude hacer que esto funcionara por mi vida, pero luego noté que estaba pasando un str, por lo que convertir el ID largo en un int hizo el truco, aunque los documentos te llevan a cree que puede usar un str, esto no es cierto al menos no en la versión del motor de la aplicación del servidor de la aplicación local dev 1.8.9. Una vez que hice un int (id_str) funcionó bien. – Shaun

+1

@Shaun, no creo que los documentos estén equivocados. si su id es un 'int', entonces tendrá que pasar un' int' y si es un 'str', entonces tiene que ser un' str'. – aschmid00

22

Otro manera: ndb.Key(YourModel, id).get().

0

Los modelos en NDB no definen su tipo de clave como parte del modelo. Esto es ingenioso porque puede tener un tipo de modelo dado al que se puede acceder a través de diferentes tipos de claves y padres, lo que los hace más flexibles. Pero es algo problemático porque no siempre está claro qué representa la clave o de dónde viene.

Así, en los casos en los que sólo hay cada vez uno tipo de clave para un modelo determinado (que es casi cada modelo), me gusta crear un método de clase para generar dicha clave, lo que añade un poco de claridad semántica :

class Book(ndb.Model): 
    title = ndb.StringProperty() 
    pages = ndb.IntegerProperty() 
    @classmethod 
    def make_key(cls, isbn): 
    return ndb.Key(cls, isbn) 

b = Book.make_key('1234-5678').get() 

de que el código añadido no es estrictamente necesario, pero se suma claridad y hace que mis modelos más largo plazo de mantener.

Cuestiones relacionadas