Ich versuche Folgendes zu tun:
Holen Sie sich die 30 Autoren mit der höchsten Punktzahl (
Author.objects.order_by('-score')[:30]
)Bestellen Sie die Autoren von
last_name
Irgendwelche Vorschläge?
python
django
django-models
RadiantHex
quelle
quelle
Antworten:
Wie wäre es mit
In Django 1.4 und höher können Sie bestellen, indem Sie mehrere Felder angeben.
Referenz: https://docs.djangoproject.com/de/dev/ref/models/querysets/#order-by
order_by (* Felder)
Standardmäßig werden die von a zurückgegebenen Ergebnisse nach
QuerySet
dem Bestelltupel sortiert, das durch dieordering
Option in der Meta des Modells angegeben wird. Sie können dies mit derorder_by
Methode pro QuerySet überschreiben .Beispiel:
Das obige Ergebnis wird nach
score
absteigend und dann nachlast_name
aufsteigend geordnet . Das negative Vorzeichen vor"-score"
zeigt die absteigende Reihenfolge an. Aufsteigende Reihenfolge ist impliziert.quelle
lambda x: x.last_name
? Es ist kürzer, ausführlicher und benötigt keinen Import.Ich wollte nur veranschaulichen, dass die integrierten Lösungen (nur SQL) nicht immer die besten sind. Zuerst dachte ich, da Djangos
QuerySet.objects.order_by
Methode mehrere Argumente akzeptiert, könnte man sie leicht verketten:Aber es funktioniert nicht wie erwartet. Beispiel: Zunächst wird eine Liste der Präsidenten nach Punktzahl sortiert (Auswahl der Top 5 zum leichteren Lesen):
Verwenden der Lösung von Alex Martelli, die genau die fünf besten Personen liefert, sortiert nach
last_name
:Und jetzt der kombinierte
order_by
Anruf:Wie Sie sehen, ist es das gleiche Ergebnis wie das erste, was bedeutet, dass es nicht wie erwartet funktioniert.
quelle
Hier ist ein Weg, der Unentschieden für den Cut-Off-Score ermöglicht.
Auf diese Weise erhalten Sie möglicherweise mehr als 30 Autoren in top_authors,
min(30,author_count)
falls Sie weniger als 30 Autoren haben.quelle