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.
3 Antworten
order_by
kann mehrere Parameter haben. Ich denke, order_by('score', '-create_time')
gibt immer den gleichen Abfragesatz zurück.
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.
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.
Verwandte Fragen
Neue Fragen
python
Python ist eine dynamisch typisierte Mehrzweck-Programmiersprache mit mehreren Paradigmen. Es wurde entwickelt, um schnell zu lernen, zu verstehen, zu verwenden und eine saubere und einheitliche Syntax durchzusetzen. Bitte beachten Sie, dass Python 2 ab dem 01.01.2020 offiziell nicht mehr unterstützt wird. Fügen Sie für versionenspezifische Python-Fragen das Tag [python-2.7] oder [python-3.x] hinzu. Wenn Sie eine Python-Variante (z. B. Jython, PyPy) oder eine Bibliothek (z. B. Pandas und NumPy) verwenden, fügen Sie diese bitte in die Tags ein.