Wie kann ich den letzten Datensatz in einem bestimmten Abfragesatz abrufen?
Antworten:
Sie können einfach so etwas tun, indem Sie reverse()
:
queryset.reverse()[0]
Beachten Sie auch diese Warnung aus der Django-Dokumentation:
... beachten Sie, dass dies
reverse()
im Allgemeinen nur für ein QuerySet aufgerufen werden sollte, das eine definierte Reihenfolge hat (z. B. beim Abfragen eines Modells, das eine Standardreihenfolge definiert, oder bei Verwendungorder_by()
). Wenn für eine bestimmte Reihenfolge keine solche Reihenfolge definiert istQuerySet
, hat das Aufrufenreverse()
keine wirkliche Auswirkung (die Reihenfolge war vor dem Aufrufreverse()
undefiniert und bleibt danach undefiniert).
latest(field_name=None)
Gibt das neueste Objekt in der Tabelle nach Datum zurück, wobei der Feldname als Datumsfeld verwendet wird.In diesem Beispiel wird der neueste Eintrag in der Tabelle gemäß dem
pub_date
Feld zurückgegeben:Entry.objects.latest('pub_date')
Der einfachste Weg ist:
books.objects.all().last()
Sie verwenden dies auch, um den ersten Eintrag wie folgt zu erhalten:
books.objects.all().first()
books.objects.last()
und books.objects.first()
sollte den Trick machen.
XYZ.objects.first()
und XYZ.objects.last()
Django> = 1,6
QuerySet-Methoden first () und last () wurden hinzugefügt. Hierbei handelt es sich um praktische Methoden, die das erste oder letzte Objekt zurückgeben, das den Filtern entspricht. Gibt None zurück, wenn keine übereinstimmenden Objekte vorhanden sind.
So erhalten Sie das erste Objekt:
ModelName.objects.first()
So erhalten Sie die letzten Objekte:
ModelName.objects.last()
Sie können Filter verwenden
ModelName.objects.filter(name='simple').first()
Das funktioniert bei mir.
Wenn der Abfragesatz bereits erschöpft ist, können Sie dies tun, um einen weiteren DB-Hinweis zu vermeiden -
last = queryset[len(queryset) - 1] if queryset else None
Nicht benutzen try...except...
.
Django wirft IndexError
in diesem Fall nicht.
Es wirft AssertionError
oder ProgrammingError
(wenn Sie Python mit der Option -O ausführen)
Wenn Sie Django 1.6 und höher verwenden, ist es jetzt viel einfacher, da die neue API eingeführt wurde -
Model.object.earliest()
Es wird spätestens () mit umgekehrter Richtung geben.
ps - Ich kenne die alte Frage. Ich poste, als ob jemand in Zukunft auf diese Frage stößt. Er lernt diese neue Funktion kennen und verwendet nicht die alte Methode.
Sie können Model.objects.last()
oder verwenden Model.objects.first()
. Wenn no ordering
definiert ist, wird das Abfrageset basierend auf dem Primärschlüssel sortiert. Wenn Sie eine Abfrage zum Bestellverhalten wünschen, können Sie sich auf die letzten beiden Punkte beziehen.
Wenn Sie dies tun möchten , Model.objects.all().last()
um das letzte und Model.objects.all().first()
das erste Element in einem Abfragesatz abzurufen oder filters
ohne einen zweiten Gedanken zu verwenden. Dann sehen Sie einige Einschränkungen unten.
Der wichtige Teil, der hier zu beachten ist, ist, dass, wenn Sie keine ordering
in Ihr Modell aufgenommen haben, die Daten in beliebiger Reihenfolge vorliegen können und Sie ein zufälliges letztes oder erstes Element haben, das nicht erwartet wurde.
Z.B. Angenommen, Sie haben ein Modell Model1
mit 2 Spalten id
und item_count
10 Zeilen mit den IDs 1 bis 10. [Es ist keine Reihenfolge definiert]
Wenn Sie Model.objects.all (). Last () wie folgt abrufen, können Sie jedes Element aus der Liste der 10 Elemente abrufen. Ja, es ist zufällig, da es keine Standardreihenfolge gibt.
Was kann man also tun?
ordering
basierend auf einem beliebigen Feld oder Feldern in Ihrem Modell definieren. Es gibt auch Leistungsprobleme. Bitte überprüfen Sie dies auch. Ref: Hierorder_by
beim Abrufen verwenden. So was:Model.objects.order_by('item_count').last()
Der einfachste Weg, ohne sich um die aktuelle Reihenfolge kümmern zu müssen, besteht darin, das QuerySet in eine Liste zu konvertieren, damit Sie die normale negative Indizierung von Python verwenden können. Wie so:
list(User.objects.all())[-1]