2010-11-29 7 views
5

Ich bin verwirrt von get_or_insert(..). Was soll ich als key_name weitergeben? Betrachten Sie das folgende Beispiel:Google App Engine - Datenspeicher get_or_insert Schlüssel_Name Konfusion

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

Angenommen, dass keine zwei Personen den gleichen Namen haben können. Angenommen, ich möchte eine neue Person mit dem Namen Peter bekommen oder einfügen, wie würde meine get_or_insert Anweisung aussehen?

Cheers,

Pete

+0

ist Ihnen bekannt, dass der deklarierte Name db.StringProperty nichts mit Schlüsselname zu tun hat? – systempuntoout

Antwort

5

Die möglicherweise hier verwirrend ist, dass der Schlüssel nicht direkt in Ihrem Modell Erklärung nicht angezeigt, so dass name = db.StringProperty Bit in Ihrem Beispiel nicht benötigt wird. get_or_insert nimmt die keyname als erstes (erforderlich) Argument, so Sie suchen Code wie:

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

So funktioniert das mit meinem Modell wie oben erklärt? – Peter

+0

Ja, aber der hier festgelegte Schlüsselname ist ein permanenter, eindeutiger Bezeichner für die Entität und keine änderbare Eigenschaft innerhalb des Entitätshauptteils. Die Eigenschaft "name" in Ihrer Modelldeklaration wird im obigen Beispiel nicht verwendet. –

+0

Ich bekomme den Fehler TypeError: 'Key' Objekt ist nicht aufrufbar – ericso

1

Sie von key_name wie ein Primärschlüssel denken kann. Sehen Sie sich die Dokumentation für get_or_insert(...) an, es gibt ein Beispiel dafür, wie der Backend-Code aussieht.

Wenn name ein eindeutiges Feld ist, möchten Sie möglicherweise auch diesen als Schlüsselnamen verwenden. Obwohl ich vorschlagen würde, weißen Raum und normalisierenden Fall zu strippen.

Verwandte Themen