Ottieni l'ultimo record con filtro in Django


92

Sto cercando di ottenere l'ultimo oggetto del modello Django ma non riesco a farlo.

Nessuno di questi funziona:

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

3
Hai provato:obj= Model.objects.filter(testfield=12).order_by('-id')[:1]
catherine

@catherine, funziona come un fascino! : D. vuoi scrivere questo come risposta così posso controllarlo?
doniyor

Nel 2018 NewsPostImage.objects.filter(newsPostTarget=img_id).first(). Spero che sia d'aiuto.
Ngatia Frankline

Risposte:


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

10
@DaveMerwin non è corretto; ci sono molti modi per risolvere questo problema e sia questa risposta che l'altra sono corrette.
Jordan

1
Nota che questo presuppone che id sia un numero intero di chiave primaria sequenziato. Che è normalmente l'impostazione predefinita per django, ma a volte no.
dalore

2
Questo potrebbe essere pericoloso perché il filtro potrebbe restituire un elenco vuoto
Kingston Chan

"-id" viene utilizzato per invertire l'ordine!
Indra

3
forse .first () invece di [0]?
fevgenym

121

Vedi i documenti di django: https://docs.djangoproject.com/en/dev/ref/models/querysets/#latest

Devi specificare un campo in latest (). per esempio.

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

Oppure se il Meta del tuo modello specifica get_latest_by, puoi lasciare l' field_nameargomento a earliest() or latest(). Django utilizzerà il campo specificato in get_latest_byper impostazione predefinita.


2
"Testfield" deve essere un campo data?
tani-rokk


17

latestè davvero progettato per funzionare con i campi data (probabilmente funziona anche con altri tipi di ordine totale, ma non è sicuro). E l'unico modo per usarlo senza specificare il nome del campo è impostare il get_latest_bymeta attributo, come menzionato qui .


8
Funziona con le chiavi primarie, puoi sempre fare qualcosa del genere:Model.objects.latest('id')
Ander

6

obj= Model.objects.filter(testfield=12).order_by('-id')[:1] è la soluzione giusta


0

Puoi fare un confronto con questo qui sotto.

Immagine

latest('created')è uguale a order_by('-created').first() Per favore correggimi se sbaglio

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.