2010-11-29 10 views
5

Estoy confundido por get_or_insert(..). ¿Qué debería pasar como el key_name? Considere el siguiente ejemplo:Google App Engine - Datastore get_or_insert key_name confusion

class Person(db.model) 
    name = db.StringProperty(required=True) 

Supongamos que no hay dos personas que tengan el mismo nombre. Supongamos que quiero obtener o insertar un nuevo Person con el nombre Peter, ¿cómo sería mi declaración get_or_insert?

Saludos,

Pete

+0

¿Está consciente de que el nombre db.StringProperty declarado no tiene nada que ver con key_name? – systempuntoout

Respuesta

5

Lo posiblemente confuso aquí es que la clave no aparece directamente en su modelo de declaración, por lo que no se necesita name = db.StringProperty poco en su ejemplo. get_or_insert lleva el nombre de clave como primer argumento (requerido), por lo que usted está buscando un código como:

person = Person.get_or_insert('Peter') 
# other interesting & useful code here... 
# later, maybe we need to retrieve that key name from the object: 
name = person.key().name() 
assert(name == "Peter") 
+0

¿Esto funcionará con mi modelo como se declaró anteriormente? – Peter

+0

Sí, pero el nombre de la clave que se establece aquí es un identificador único y permanente para la entidad, en lugar de una propiedad mutable dentro del cuerpo de la entidad. La propiedad "nombre" en su declaración de modelo no se utiliza en el ejemplo anterior. –

+0

Aparece el error TypeError: el objeto 'Clave' no se puede llamar – ericso

1

Se puede pensar en key_name como una llave primaria. Mire los documentos para get_or_insert(...), hay un ejemplo de cómo se ve el código de fondo.

Si el nombre es un campo único, es posible que desee usarlo también como el nombre de la clave. Aunque sugeriría eliminar el espacio en blanco y normalizar el caso.