2011-06-05 11 views
8

Me gustaría saber donde ir a buscar registros utilizando Model.get_by_key_name() vs Model.get_by_id()gae get_by_id Modelo() vs get_by_key_name()

Por ejemplo, digamos que estoy regresando algunos JSON que se utilizará para mostrar una tabla de registros, y para cada registro, hay un botón para eliminar ese registro. Supongamos que tengo el modelo 'Foo' y la instancia del modelo 'foo'.

Creo que puedo asociar cada botón con el registro apropiado utilizando:

str(foo.key()) #suppose it eval's to "axhYm92ZZXJvY2tyDgsSCENhnb3J5GBQM" 

o

foo.key().id() #suppose it eval's to "57" 

Uno de estos valores se abrirá camino en un formulario HTML y, el usuario puede hacer clic el botón que hace la solicitud para eliminar el registro con esta clave/id.

La solicitud sería entonces como resultado ya sea:

Foo.get_by_key_name("axhYm92ZZXJvY2tyDgsSCENhnb3J5GBQM").delete() 

o

Foo.get_by_id(57).delete() 

Ahora, siendo la indecisión a balazos programador TDAH que soy, lo que necesito saber ... que es el "¿manera correcta? Ambos parecen funcionar, pero ¿hay circunstancias que lo hagan preferible al otro? ¿Hay alguna ventaja al usar la forma 'clave' frente a la 'forma' id?

Respuesta

11

estás confundiendo un nombre de tecla con stringified. Ellos son diferentes. El nombre de una clave es algo que usted otorga a una entidad a través de la propiedad reservada key_name en tiempo de construcción. Si no lo hace, el sistema generará una identificación. Una clave de entidad puede tener un nombre o una identificación, pero no ambos.

Si ha Stringified intencionadamente una clave, que reconstituirlo pasando de nuevo al constructor clave.

stringifiedKey = str(key) 
reconstitutedKey = db.Key(stringifiedKey) 

Asumiendo que realmente quiso decir nombre vs. id, es una cuestión de lo que sea más conveniente. Cualquier diferencia de rendimiento será microscópica.

2

lo que está recibiendo no es una cadena de clave de un nombre_tecla. Si quieres obtener un objeto de su cadena clave. Luego, usa Model.get(keystring). Key_name es lo que asigna a un objeto que se supone que es único. Si crees que puedes usar cualquier atributo que sea único, puedes hacerlo como un key_name else para obtener el ID generado por defecto. Lo único que se obtiene en el uso de un nombre_tecla es get_or_insert() que devuelve una entidad si una entidad con la que el nombre de la clave existe otra cosa crea una y lo devuelve.

+0

realidad que debe ser 'Model.get (db.Key (keystring))' ¿verdad? –

+0

No get() también se puede obtener de una entidad keystring Model.get (keystring) –

+0

¿En serio? Revisé la documentación y no encontré ninguna mención de ella, pero es bueno saberlo. Gracias. –