¿Cómo puedo recuperar el último registro de un determinado conjunto de consultas?
Respuestas:
EDITAR: ahora tienes que usar Entry.objects.latest('pub_date')
Simplemente podría hacer algo como esto, usando reverse()
:
queryset.reverse()[0]
Además, tenga cuidado con esta advertencia de la documentación de Django:
... tenga en cuenta que
reverse()
generalmente solo se debe llamar en un QuerySet que tiene un orden definido (por ejemplo, cuando se consulta contra un modelo que define un orden predeterminado, o cuando se usaorder_by()
). Si no se define tal orden para un determinadoQuerySet
, invocarloreverse()
no tiene ningún efecto real (el orden no estaba definido antes de la llamadareverse()
y permanecerá indefinido después).
latest(field_name=None)
devuelve el último objeto de la tabla, por fecha, utilizando el field_name proporcionado como el campo de fecha.Este ejemplo devuelve la última entrada de la tabla, según el
pub_date
campo:
Entry.objects.latest('pub_date')
La forma más sencilla de hacerlo es:
books.objects.all().last()
También usa esto para obtener la primera entrada así:
books.objects.all().first()
books.objects.last()
y books.objects.first()
debería hacer el truco.
XYZ.objects.first()
y XYZ.objects.last()
Django> = 1.6
Se agregaron los métodos QuerySet first () y last () que son métodos convenientes que devuelven el primer o último objeto que coincide con los filtros. Devuelve Ninguno si no hay objetos que coincidan.
Para obtener el primer objeto:
ModelName.objects.first()
Para obtener los últimos objetos:
ModelName.objects.last()
Puedes usar el filtro
ModelName.objects.filter(name='simple').first()
Esto funciona para mi.
Cuando el conjunto de consultas ya está agotado, puede hacer esto para evitar otra sugerencia de db:
last = queryset[len(queryset) - 1] if queryset else None
No lo use try...except...
.
Django no lanza IndexError
en este caso.
Lanza AssertionError
o ProgrammingError
(cuando ejecuta python con la opción -O)
Si usa django 1.6 y versiones posteriores, es mucho más fácil ahora que se introdujo la nueva api:
Model.object.earliest()
Dará último () con dirección inversa.
PD: sé que es una pregunta anterior, publico como si, en el futuro, alguien aterrizara en esta pregunta, conozca esta nueva característica y no termine usando el método anterior.
Puede usar Model.objects.last()
o Model.objects.first()
. Si no ordering
se define, el conjunto de consultas se ordena en función de la clave principal. Si desea un conjunto de consultas de comportamiento de pedidos, puede consultar los dos últimos puntos.
Si está pensando en hacer esto, Model.objects.all().last()
recuperar el último y Model.objects.all().first()
recuperar el primer elemento en un conjunto de consultas o usarlo filters
sin pensarlo dos veces. Luego, vea algunas advertencias a continuación.
La parte importante a tener en cuenta aquí es que si no ha incluido ninguno ordering
en su modelo, los datos pueden estar en cualquier orden y tendrá un último o primer elemento aleatorio que no se esperaba.
P.ej. Supongamos que tiene un modelo nombrado Model1
que tiene 2 columnas id
y item_count
10 filas con id 1 a 10. [No hay ningún orden definido]
Si obtiene Model.objects.all (). Last () de esta manera, puede obtener cualquier elemento de la lista de 10 elementos. Sí, es aleatorio ya que no hay un orden predeterminado.
Entonces, ¿qué puede hacerse?
ordering
función de cualquier campo o campos de su modelo. También tiene problemas de rendimiento, compruébalo también. Ref: Aquíorder_by
mientras busca. Me gusta esto:Model.objects.order_by('item_count').last()
La forma más sencilla, sin tener que preocuparse por el orden actual, es convertir el QuerySet en una lista para que pueda usar la indexación negativa normal de Python. Al igual que:
list(User.objects.all())[-1]