2010-11-26 7 views
0

Ich habe eine Frage zu Google App Engine und zur Abfrage des Datenspeichers.Wie bekomme ich alle Entitäten einer App Engine-Modellklasse, einschließlich derer ihrer Unterklassen?

Angenommen, ich habe drei Klassen bekam:

class Animal(db.Model): 
    age = db.IntegerProperty() 

class Giraffe(Animal): 
    # ... 

class Mouse(Animal): 
    # ... 

Jetzt möchte ich alle Tiereinheiten erhalten. Ich könnte versuchen

Animal.all() 

Aber das gibt nichts zurück (Ich habe alle Animal Entitäten mit der Giraffe und Maus Konstruktoren erstellt).

Wie bekomme ich alle Animal Entitäten? Ist der allgemeine Ansatz (Unterklassen einer Unterklasse von db.Modell) in Ordnung?

Antwort

2

App Engine unterstützt nicht direkt die Klassenvererbung, aber es gibt eine Erweiterung, die in das SDK namens PolyModel integriert ist. Ändern Sie Ihre Animal-Klasse, um PolyModel statt Model zu erweitern, und alles funktioniert so, wie Sie es erwarten.

0

Der Datenspeicher verfolgt Vererbungen wie diesen nicht. Jede Entität hat eine einzige "Art".

Wenn Sie möchten, dass alle Tiere von der gleichen Art sind, könnten Sie eine Eigenschaft haben, die angibt, welche Art von Tier (Giraffe oder Maus) es ist. Sie würden also jede neue Entität zu einer Animal machen, aber dann die Eigenschaft "type" oder was auch immer auf Giraffe oder Maus setzen. Sie verlieren einige der schönen Eigenschaften der Vererbung auf diese Weise, die ein Ziehen ist.

+0

Aw, danke. Das Problem ist, dass ich mit der Giraffe anders als mit der Maus interagieren muss, und sie haben unterschiedliche Eigenschaften. Kennen Sie die empfohlene Vorgehensweise? Ich kann mir a) die Daten als String-Eigenschaft speichern (z. B. Animal.specialInfo = "Species: Maus, Favorite_brand_of_cheese: xyz") oder b) eine Liste verwenden, die auf die einzelnen Unterklassen verweist (ich könnte eine AnimalCollection erstellen). – weiqure

+0

Sie können Ihr aktuelles Setup beibehalten, und ändern Sie einfach Ihre Abfrage - anstelle von Animal.all(), rufen Sie Giraffe.all() und Mouse.all() und kombinieren Sie diese Ergebnisse in einer Liste von generischen 'Animals'. –

+0

Das Problem damit ist, dass ich den Listengenerierungscode für jede neue Klasse anpassen muss, die ich habe. Aber ich denke ich werde das tun, wenn ich keine bessere Lösung finde. – weiqure