2010-02-07 15 views
6

Mit Google App Engine SDK und Python habe ich ein Problem: Ich kann nicht auf die ID-Eigenschaft einer bestimmten Entitätseigenschaft zugreifen. Die einzigen Eigenschaften kann ich auf solche in meiner Klasse Modell definiert ist, sowie die Schlüsseleigenschaft (siehe unten beantworten):Zugriff auf die ID-Eigenschaft von einer Datenspeicherentität aus möglich

class Question(db.Model): 
    text = db.StringProperty() 
    answers = db.StringListProperty() 
    user = db.UserProperty() 
    datetime = db.DateTimeProperty() 

I Text, Antworten zugreifen kann, Benutzer, Datetime und Schlüsseleigenschaften gut. Ich kann jedoch nicht auf die ID-Eigenschaft zugreifen. Zum Beispiel, nachdem alle Einheiten holte (mit möglicher Frage()):

# OK Within a template, this will return a string : 
{{ question.text }} 
# OK, this will return the entity key : 
{{ question.key }} 

# KO this will return nothing : 
{{ question.id }} 

Irgendwelche Ideen? Vielen Dank !

+0

Schlüssel und ID sind keine Eigenschaften einer Datenspeicherentität. key() ist eine Instanzmethode und id() ist eine Instanzmethode des Schlüssels. {{entity.key.id}} funktioniert nur, weil das Bit nach dem. wird bei Bedarf als Methodenaufruf interpretiert. – geoffspear

Antwort

10

Gemäß der documentation ist keine Instanzmethode id() für Modellunterklassen definiert.

Versuchen Sie stattdessen {{ question.key }}.

Beachten Sie auch, dass der Schlüssel erst erstellt wird, wenn die Entität im Datenspeicher gespeichert wird.


Edit: Weitere Informationen basierend auf OPs edit:

Da wir wirklich sind, nachdem die numerische ID wir so etwas in unserem Template tun könnte:

{{ question.key.id }}

Noch ein Hinweis: Sie sollten niemals erwarten, dass numerische IDs ihren Wert entsprechend der Reihenfolge der Entity-Erstellung erhöhen. In der Praxis ist dies normalerweise - aber nicht immer - der Fall.

+0

Tatsächlich funktioniert {{question.key}} einwandfrei und gibt den im Datenspeicher gespeicherten Schlüssel zurück. Ich hätte nachsehen sollen! Ich könnte meinen ursprünglichen Beitrag bearbeiten. Also denke ich, das Abrufen der ID ist das einzige Problem. – jbmusso

+0

danke für die schnellen Antworten, löste meine Probleme perfekt! – jbmusso

+0

@Sorw: Jederzeit. Willkommen bei SO. – bernie

5

Ich habe gerade eine mögliche (unelegante, IMO) Lösung gefunden. Nach Abfrage und Einheiten, eine Schleife durch alle von ihnen holen und manuell die ID-Parameter hinzu:

query = Question.all() 
questions = query.fetch(10) 

# Add ID property : 
for question in questions: 
    question.id = str(question.key().id()) 

Ich glaube nicht, es ist eine effiziente CPU klug, aber es funktioniert als eine schnelle/schmutzig fix.

+0

@Sorw: Sie müssen dies nicht tun. Siehe meine bearbeitete Antwort. – bernie

+0

@Adam: hehe Ich denke, wir haben beide eine mögliche Lösung zur gleichen Zeit gefunden, aber deine ist viel einfacher! – jbmusso

+0

Inelegant, vielleicht, aber +1 zu Ihnen, um zu einer Lösung zu kommen. – bernie

Verwandte Themen