¿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_datecampo: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 IndexErroren este caso.
Lanza AssertionErroro 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 orderingse 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 filterssin 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 orderingen 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 Model1que tiene 2 columnas idy item_count10 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?
orderingfunción de cualquier campo o campos de su modelo. También tiene problemas de rendimiento, compruébalo también. Ref: Aquíorder_bymientras 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]