Ich würde gerne wissen, wie Djangos order_by funktioniert, wenn die Werte des angegebenen order_by Felds für eine Reihe von Datensätzen gleich sind. Angenommen, ich habe ein score Feld in der Datenbank und filtere das Abfrageset mit order_by('score'). Wie ordnen sich Datensätze mit denselben Werten für die Punktzahl an?

Jedes Mal werden sie zufällig innerhalb der Teilmenge der Datensätze mit gleicher Punktzahl sortiert, wodurch die Paginierung auf Client-Seite unterbrochen wird. Gibt es eine Möglichkeit, dies zu überschreiben und die Datensätze in einer konsistenten Reihenfolge zurückzugeben?

Ich benutze Django 1.4 und PostgreSQL.

6
Babu 8 Okt. 2012 im 09:34

3 Antworten

Beste Antwort

order_by kann mehrere Parameter haben. Ich denke, order_by('score', '-create_time') gibt immer den gleichen Abfragesatz zurück.

11
Hedde van der Heide 8 Okt. 2012 im 07:19

Wenn ich das richtig verstehe, denke ich, dass Sie jedes Mal eine konsistent geordnete Ergebnismenge benötigen. Sie können so etwas wie order_by('score','id') verwenden, das zuerst nach der Punktzahl und dann nach dem automatischen Inkrement id innerhalb des {{ X2}} mit denselben Werten, daher ist Ihre Ausgabe konsistent. Die Dokumentation ist hier. Sie müssen in order_by explizit angegeben werden, wenn Sie jedes Mal die richtige Ergebnismenge abrufen möchten. Die Verwendung von 'id' ist eine der Möglichkeiten.

2
bhatiaravi 8 Okt. 2012 im 07:50

Wie die anderen Antworten richtig erklären, akzeptiert order_by() mehrere Argumente. Ich würde vorschlagen, etwas zu verwenden wie:

qs.order_by('score','pk') #where qs is your queryset

Ich empfehle in diesen Fällen die Verwendung von 'pk' (oder '-pk') als letztes Argument, da jedes Modell ein pk -Feld hat und sein Wert für 2 Datensätze niemals gleich ist.

12
Anuj Gupta 8 Okt. 2012 im 07:35