So führen Sie diese Join-Abfrage in Django durch

8

In Django habe ich zwei Modelle:

%Vor%

Ich lege den Rang in eine separate Tabelle, weil jede Ansicht einer Seite dazu führt, dass sich der Rang ändert und ich befürchte, dass all diese Schreibvorgänge meine anderen (meist gelesenen) Abfragen verlangsamen würden.

Ich sammle eine Liste von Products aus einer einfachen Abfrage:

%Vor%

Ich würde jetzt gerne alle Ränge für diese Produkte bekommen. Ich würde es vorziehen, alles auf einmal zu machen (mit einem SQL-Join) und ich frage mich, wie ich das mit dem Abfragemechanismus von Django ausdrücken kann.

Was ist der richtige Weg, dies in Django zu tun?

    
Frank Krueger 13.05.2009, 23:34
quelle

3 Antworten

12

Dies kann in Django gemacht werden, aber Sie müssen Ihre Modelle ein wenig anders umstrukturieren:

%Vor%

Beim Abrufen von Produktobjekten können Sie nun die Eins-zu-Eins-Beziehung in einer Abfrage mit dem select_related () Methode:

%Vor%

Dies erzeugt eine Abfrage, die Produktranglisten mit einem Join abruft:

%Vor%

Ich musste das Beziehungsfeld zwischen Product und ProductRank in das Produktmodell verschieben, da es so aussieht, als ob select_related () Fremdschlüsseln nur in eine Richtung folgt.

    
Ayman Hourieh 13.05.2009, 23:55
quelle
4

Ich habe nicht überprüft, aber:

%Vor%

Sollte jede Instanz erfassen.

    
Ale 14.05.2009 01:20
quelle
2

Fügen Sie der select_related () -Methode des QuerySets einen Aufruf hinzu, obwohl ich nicht davon überzeugt bin, Referenzen in beide Richtungen zu erfassen, ist dies die wahrscheinlichste Antwort.

    
ironfroggy 13.05.2009 23:50
quelle

Tags und Links