2010-02-03 42 views

Respuesta

60

Simplemente podría hacer algo como esto, usando reverse():

queryset.reverse()[0] 

Además, tenga cuidado esta advertencia de la documentación de Django:

... reverse() en cuenta que debe en general, sólo se llamará en un QuerySet que tiene un orden definido (por ejemplo, al consultar un modelo que define un pedido predeterminado, o cuando usando order_by()). Si no hay tal ordenar se define para un determinado QuerySet, llamando reverse() en él no tiene efecto real (el orden no estaba definido antes de llamar reverse(), y se permanecen indefinidos después).

+0

thnx ... no sabía esto – Stephen

+1

como se dice en django docs,: "tenga en cuenta que reverse() generalmente solo debe invocarse en un QuerySet que tiene un orden definido (por ejemplo, al consultar con un modelo que define un orden predeterminada, o al usar order_by()). Si no se define tal orden para un QuerySet dado, llamar a reverse() no tiene ningún efecto real (el orden no se definió antes de llamar a reverse(), y permanecerá indefinido después) " – jujule

+2

He editado esa advertencia en su respuesta, espero que esté bien. –

93

Django Doc:

latest(field_name=None) devuelve el último objeto en la tabla, por fecha, mediante el nombre_campo proporcionado como el campo de fecha.

Este ejemplo devuelve la última entrada en la tabla, de acuerdo con el campo pub_date:

Entry.objects.latest('pub_date') 
+20

Esto también funciona. 'Entry.objects.latest ('id')' – Renyi

+4

Esta es la forma perfecta de hacerlo. Además, "si el Meta de su modelo especifica get_latest_by, puede dejar fuera el argumento field_name a latest()" según los documentos. –

-4

La forma más sencilla, sin tener que preocuparse por el ordenamiento actual, es convertir el QuerySet a una lista para que puedas usar la indexación negativa normal de Python. De este modo:

list(User.objects.all())[-1] 
+1

Esto consultará TODOS los objetos de la base de datos y luego tomará el primero – warvariuc

+0

¡Buen punto! Obviamente no pensé en eso. La respuesta .reverse() (actualmente seleccionada) es la forma correcta de hacerlo. –

3

Si se utiliza Django 1.6 o superior, es mucho más fácil ahora que ha introducido la nueva API -

Model.object.earliest() 

Dará última() con dirección inversa.

p.s. - Sé que es una vieja pregunta, publicando como si al avanzar alguien llegara a esta pregunta, conocieran esta nueva característica y no terminaran usando el método anterior.

+3

from docs: first() y latest() requieren un parámetro field_name o 'get_latest_by' en el modelo – panchicore

28

Django> = 1,6

métodos Agregado de QuerySet primero() y la última() que son métodos de conveniencia que regresan el primero o el último objeto búsqueda de los filtros. Devuelve None si no hay objetos que coincidan.

3

Cuando el conjunto de consultas ya está agotada, es posible hacer esto para evitar otra pista db -

last = queryset[len(queryset) - 1] if queryset else None 

No utilice try...except....
Django no arroja IndexError en este caso.
arroja AssertionErrorProgrammingError o (cuando se ejecuta pitón con la opción -O)

20

La forma más sencilla de hacerlo es:

books.objects.all().last() 

También puede utilizar esto para conseguir la primera entrada de este modo:

books.objects.all().first() 
+1

Sí, funcionó sin problemas. – Jay

+4

'books.objects.last()' y 'books.objects.first()' deberían hacer el truco. – chandan

11

Para conseguir el primer objetivo:

ModelName.objects.first() 

Para conseguir los objetos últimos:

ModelName.objects.last() 

puede usar el filtro

ModelName.objects.filter(name='simple').first() 

Esto funciona para mí.

Cuestiones relacionadas