2010-11-29 5 views
5

Je suis confus par get_or_insert(..). Que devrais-je passer en tant que key_name? Considérez l'exemple suivant:Google App Engine - Datastore get_or_insert nom_clé confusion

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

Supposons que deux personnes ne portent pas le même nom. Dire que je veux obtenir ou insérer un nouveau Person avec le nom Peter, à quoi ressemblerait ma déclaration get_or_insert?

Cheers,

Pete

+0

savez-vous que le nom db.StringProperty déclaré n'a rien à voir avec key_name? – systempuntoout

Répondre

5

La chose est peut-être source de confusion ici que la clé ne montre pas directement dans votre déclaration de modèle, de sorte que peu name = db.StringProperty dans votre exemple n'est pas nécessaire. get_or_insert prend la keyname comme premier argument (requis), de sorte que vous êtes à la recherche de code comme:

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

Donc, cela fonctionnera avec mon modèle comme indiqué ci-dessus? – Peter

+0

Oui, mais le nom de clé défini ici est un identificateur unique et permanent pour l'entité, plutôt qu'une propriété mutable dans le corps de l'entité. La propriété "name" de votre déclaration de modèle est inutilisée dans l'exemple ci-dessus. –

+0

Je reçois l'erreur TypeError: l'objet 'Key' n'est pas appelable – ericso

1

Vous pouvez penser à key_name comme une clé primaire. Regardez les documents pour get_or_insert(...), il y a un exemple de ce que le code back-end ressemble.

Si le nom est un champ unique, vous pouvez également l'utiliser comme nom de clé. Bien que je suggère de dépouiller l'espace blanc et normaliser le cas.