In django, wie sortiere ich ein Modell auf einem Feld und dann das letzte Element erhalten?
-
05-07-2019 - |
Frage
Insbesondere Ich habe ein Modell, das ein Feld wie diese hat
pub_date = models.DateField("date published")
Ich möchte in der Lage sein, leicht mit dem jüngsten pub_date
das Objekt zu greifen. Was ist der einfachste / beste Weg, dies zu tun?
Wäre so etwas wie die folgenden tun, was ich will?
Edition.objects.order_by('pub_date')[:-1]
Lösung
obj = Edition.objects.latest('pub_date')
Sie können auch die Dinge vereinfachen, indem sie get_latest_by
in dem Meta Modell, dann werden Sie in der Lage sein zu tun,
obj = Edition.objects.latest()
Siehe die docs Für mehr Information. Sie werden wahrscheinlich wollen auch die ordering
Meta-Option setzen .
Andere Tipps
Harley Antwort ist die Art und Weise für den Fall zu gehen, wo Sie die neueste nach einigen Ordnungskriterien für bestimmte Modelle mögen, wie Sie das tun, aber die allgemeine Lösung ist, die Bestellung und rufen Sie den ersten Punkt zu umkehren:
Edition.objects.order_by('-pub_date')[0]
Hinweis:
Normale Python Listen akzeptieren negative Indizes, die einen Versatz von dem Ende der Liste bedeuten, anstatt am Anfang wie eine positive Zahl. Allerdings wird QuerySet Objekte erhöhen
AssertionError: Negative indexing is not supported.wenn Sie einen negativen Index, der ist, warum Sie das tun, was insin sagte:. Die umzukehren und das
0th
Element greifen
Seien Sie vorsichtig mit
Edition.objects.order_by('-pub_date')[0]
, wie Sie vielleicht eine leere QuerySet werden Indizierung. Ich bin nicht sicher, was der richtige Pythonic Ansatz ist, aber die einfachste wäre es in einem einzuwickeln if / else oder try / catch:
try:
last = Edition.objects.order_by('-pub_date')[0]
except IndexError:
# Didn't find anything...
Aber, wie @Harley sagte, wenn Sie nach dem Datum sind die Bestellung latest()
ist die djangonic Art und Weise, es zu tun.
Dies wird bereits beantwortet worden, aber für mehr Referenz, das ist, was Django Book hat über Slicing Daten über QuerySets sagen:
Beachten Sie, dass negativer Slicing nicht unterstützt:
>>> Publisher.objects.order_by('name')[-1] Traceback (most recent call last): ... AssertionError: Negative indexing is not supported.
Das ist leicht zu umgehen, though. Ändern Sie einfach die order_by () Anweisung, wie folgt aus:
>>> Publisher.objects.order_by('-name')[0]
Siehe den Link für weitere solche Details. Hoffe, das hilft!