Erlangte geerbte Modellobjekte in django

8

Ich habe eine Django-Anwendung mit dem folgenden Modell:

Das Objekt A ist ein einfaches Objekt, das sich von Model mit einigen Feldern erstreckt, und ein bestimmtes Feld ist ein char-Feld namens "NAME" und ein Integer-Feld "ORDER" genannt. A ist abstrakt, dh es gibt keine A Objekte in der Datenbank, sondern stattdessen ...

Objekte B und C sind Spezialisierungen von A , das heißt, sie erben von A und fügen andere hinzu Felder.

Nun nehme ich an, ich brauche alle Objekte, deren Feld NAME mit dem Buchstaben "Z" beginnt, geordnet nach dem Feld ORDER , aber ich Sie möchten alle B und C spezifischen Felder für diese Objekte verwenden. Jetzt sehe ich 2 Ansätze:

a) Führen Sie die Abfragen einzeln für B und C -Objekte durch und rufen Sie zwei Listen ab, führen Sie sie zusammen, sortieren Sie sie manuell und arbeiten Sie damit.

b) Fragen Sie A Objekte nach Namen ab, die mit "Z" beginnen, geordnet nach "ORDER" und mit dem Ergebnis die abfragen B und C Objekte, um alle verbleibenden Daten zu übertragen.

Beide Ansätze klingen sehr ineffizient, im ersten muss ich sie selbst anordnen, im zweiten muss ich die Datenbank mehrfach abfragen.

Gibt es einen magischen Weg, den ich vermisse, um alle B und C Objekte zu erhalten, geordnet nach einer einzigen Methode? Oder zumindest ein effizienterer Weg als die beiden genannten?

Vielen Dank im Voraus!

Bruno

    
Bruno 02.03.2011, 23:57
quelle

4 Antworten

5

Wenn A konkret sein kann, können Sie dies alles in einer Abfrage mit select_related machen.

%Vor%     
DrMeers 03.03.2011, 06:57
quelle
0

Wenn Sie mit Ihrer "b" -Methode Abfragen durchführen, können Sie alle verbleibenden Daten "einbringen", ohne Ihre B- und C-Modelle separat abzufragen. Sie können die Beziehung "dot smallcase model name" verwenden.

Ссылка

%Vor%

Sie müssen möglicherweise Ausnahmen von DoesNotExist versuchen. Ich bin ein wenig eingerostet mit meinem Django. Viel Glück.

    
DTing 03.03.2011 05:42
quelle
0

Solange Sie beide Abfragen auf B und C anordnen, ist es ziemlich einfach, sie zusammenzufassen, ohne ein teures Resort zu machen:

%Vor%

Der Vorteil dieser Technik ist, dass sie mit einer abstrakten Basisklasse arbeitet.

    
Wogan 03.03.2011 08:28
quelle
0

Diese Frage wurde hier beantwortet.

Verwenden Sie den InheritanceManager aus dem django-model-utils Projekt.

    
Philipp Zedler 08.08.2013 14:30
quelle

Tags und Links