Obtenga el último registro con filtro en Django

90

Estoy tratando de obtener el último objeto de modelo de Django pero parece que no puedo tener éxito.

Ninguno de estos funciona:

obj = Model.objects.filter(testfield=12).latest()
obj = Model.objects.latest().filter(testfield=12)
donante
fuente
3
¿Usted ha intentado:obj= Model.objects.filter(testfield=12).order_by('-id')[:1]
Catalina
@catherine, ¡trabajando como un encanto! :RE. ¿Quieres escribir esto como respuesta para que pueda verificarlo?
donante
En 2018 NewsPostImage.objects.filter(newsPostTarget=img_id).first(). Espero eso ayude.
Ngatia Frankline

Respuestas:

101
obj= Model.objects.filter(testfield=12).order_by('-id')[0]
Catalina
fuente
10
@DaveMerwin no es incorrecto; Hay varias formas de resolver este problema, y ​​tanto esta respuesta como la otra son correctas.
Jordania
1
Tenga en cuenta que esto supone la suposición de que id es un entero de clave primaria secuenciado. Normalmente es el valor predeterminado de django, pero a veces no.
dalore
2
Esto podría ser peligroso porque el filtro podría devolver una lista vacía
Kingston Chan
'-id' se usa para invertir el orden.
Indra
3
tal vez .first () en lugar de [0]?
fevgenym
119

Vea los documentos de django: https://docs.djangoproject.com/en/dev/ref/models/querysets/#latest

Debe especificar un campo en latest (). p.ej.

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

O si el Meta de su modelo especifica get_latest_by, puede dejar el field_nameargumento a earliest() or latest(). Django usará el campo especificado en get_latest_bypor defecto.

Pranav Singh
fuente
2
¿"Testfield" tiene que ser un campo de fecha?
tani-rokk
25

último () último ()

Utilice el último ():

ModelName.objects.last()

usando latest ():

ModelName.objects.latest('id')
Subin Shrestha
fuente
17

latestestá realmente diseñado para trabajar con campos de fecha (probablemente también funcione con otros tipos de orden total, pero no estoy seguro). Y la única forma en que puede usarlo sin especificar el nombre del campo es configurando el get_latest_bymeta atributo, como se menciona aquí .

acjay
fuente
8
Funciona con claves primarias, siempre puede hacer algo como esto:Model.objects.latest('id')
Ander
6

obj= Model.objects.filter(testfield=12).order_by('-id')[:1] es la solucion correcta

Thomas John
fuente