Holen Sie sich den neuesten Datensatz mit Filter in Django


89

Ich versuche, das neueste Django-Modellobjekt zu erhalten, kann aber anscheinend nicht erfolgreich sein.

Beides funktioniert nicht:

obj = Model.objects.filter(testfield=12).latest()
obj = Model.objects.latest().filter(testfield=12)

3
Haben Sie versucht:obj= Model.objects.filter(testfield=12).order_by('-id')[:1]
Catherine

@ Catherine, arbeitet wie ein Zauber! : D. Sie möchten dies als Antwort schreiben, damit ich es überprüfen kann?
Doniyor

Im Jahr 2018 NewsPostImage.objects.filter(newsPostTarget=img_id).first(). Ich hoffe es hilft.
Ngatia Frankline

Antworten:


99
obj= Model.objects.filter(testfield=12).order_by('-id')[0]

10
@ DaveMerwin es ist nicht falsch; Es gibt mehrere Möglichkeiten, dieses Problem zu lösen, und sowohl diese als auch die andere Antwort sind korrekt.
Jordanien

Beachten Sie, dass davon ausgegangen wird, dass id eine sequenzierte Primärschlüssel-Ganzzahl ist. Welches ist normalerweise die Standardeinstellung für Django, aber manchmal nicht.
Bangalore

2
Dies könnte gefährlich sein, da Filter eine leere Liste zurückgeben könnte
Kingston Chan

'-id' wird verwendet, um die Reihenfolge umzukehren!
Indra

3
vielleicht .first () statt [0]?
Fevgenym

116

Siehe die Dokumente von django: https://docs.djangoproject.com/de/dev/ref/models/querysets/#latest

Sie müssen ein Feld in latest () angeben. z.B.

obj= Model.objects.filter(testfield=12).latest('testfield')

Oder wenn die Meta Ihres Modells get_latest_by angibt, können Sie das field_nameArgument auf weglassen earliest() or latest(). Django verwendet das get_latest_bystandardmäßig angegebene Feld .


2
Muss "Testfeld" ein Datumsfeld sein?
Tani-Rokk


16

latestist wirklich für die Arbeit mit Datumsfeldern konzipiert (es funktioniert wahrscheinlich auch mit anderen Typen mit Gesamtreihenfolge, ist sich aber nicht sicher). Sie können es nur verwenden, ohne den Feldnamen anzugeben get_latest_by, indem Sie das hier erwähnte Metaattribut festlegen .


8
Es funktioniert mit Primärschlüsseln, Sie können immer so etwas tun:Model.objects.latest('id')
Ander

6

obj= Model.objects.filter(testfield=12).order_by('-id')[:1] ist die richtige Lösung

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.