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)
Doniyor
quelle
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]
Catherine
quelle
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 .

Pranav Singh
quelle
2
Muss "Testfeld" ein Datumsfeld sein?
Tani-Rokk
23

last () latest ()

Usign last ():

ModelName.objects.last()

using latest ():

ModelName.objects.latest('id')
Subin Shrestha
quelle
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 .

acjay
quelle
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

Thomas John
quelle