21 Stimmen

In Django, wie ich ein Modell auf ein Feld sortieren und dann das letzte Element erhalten?

Konkret habe ich ein Modell, das ein Feld wie das folgende enthält

pub_date = models.DateField("date published")

Ich möchte in der Lage sein, das Objekt mit der neuesten pub_date . Was ist der einfachste/beste Weg, dies zu tun?

Würde etwas wie das Folgende das tun, was ich will?

Edition.objects.order_by('pub_date')[:-1]

34voto

Harley Holcombe Punkte 165146
obj = Edition.objects.latest('pub_date')

Sie können die Dinge auch vereinfachen, indem Sie get_latest_by in der Meta des Modells, dann können Sie Folgendes tun

obj = Edition.objects.latest()

Véase die Dokumente für weitere Informationen. Wahrscheinlich möchten Sie auch die Option ordering Meta-Option.

23voto

Jonny Buchanan Punkte 60128

Harleys Antwort ist der richtige Weg für den Fall, dass Sie das Neueste nach bestimmten Ordnungskriterien für bestimmte Modelle suchen, wie Sie es tun, aber die allgemeine Lösung ist, die Reihenfolge umzukehren und das erste Element abzurufen:

Edition.objects.order_by('-pub_date')[0]

4voto

Dan Punkte 4515

Note :

Normale Python-Listen akzeptieren negative Indizes, die einen Versatz vom Ende der Liste und nicht vom Anfang wie eine positive Zahl bedeuten. Allerdings lösen QuerySet-Objekte

AssertionError: Negative indexing is not supported.wenn Sie einen negativen Index verwenden, weshalb Sie tun müssen, was insin sagte: die Reihenfolge umkehren und die `0th` Element.

2voto

Yogi Punkte 51

Seien Sie vorsichtig bei der Verwendung von

Edition.objects.order_by('-pub_date')[0]

da Sie möglicherweise ein leeres QuerySet indizieren. Ich bin nicht sicher, was die richtige Pythonic Ansatz ist, aber die einfachste wäre, es in einem if/else oder try/catch zu verpacken:

try:
    last = Edition.objects.order_by('-pub_date')[0]
except IndexError:
    # Didn't find anything...

Aber, wie @Harley sagte, wenn Sie nach Datum bestellen, latest() ist die djangonisch Weise zu tun.

0voto

Diese Frage wurde bereits beantwortet, aber zur besseren Orientierung finden Sie hier folgende Informationen Django-Buch über Slicing Data on QuerySets zu sagen hat:

Beachten Sie, dass negatives Slicing nicht unterstützt wird:

>>> Publisher.objects.order_by('name')[-1]
Traceback (most recent call last):
  ...
AssertionError: Negative indexing is not supported.

Dies lässt sich jedoch leicht umgehen. Ändern Sie einfach die order_by() Anweisung, etwa so:

>>> Publisher.objects.order_by('-name')[0]

Weitere Einzelheiten finden Sie unter dem Link. Hoffentlich hilft das!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X