En django, ¿cómo ordeno un modelo en un campo y luego obtengo el último elemento?
-
05-07-2019 - |
Pregunta
Específicamente, tengo un modelo que tiene un campo como este
pub_date = models.DateField("date published")
Quiero poder capturar fácilmente el objeto con el pub_date
más reciente. ¿Cuál es la forma más fácil / mejor de hacer esto?
¿Algo como lo siguiente haría lo que quiero?
Edition.objects.order_by('pub_date')[:-1]
Solución
obj = Edition.objects.latest('pub_date')
También puede simplificar las cosas poniendo
obj = Edition.objects.latest()
Consulte los documentos para más información. Probablemente también querrá configurar el ordenando
opción Meta.
Otros consejos
La respuesta de Harley es el camino a seguir para el caso en el que desee lo último según algunos criterios de pedido para Modelos particulares, como lo hace, pero la solución general es revertir el pedido y recuperar el primer artículo:
Edition.objects.order_by('-pub_date')[0]
Nota:
Las listas normales de python aceptan índices negativos, lo que significa un desplazamiento desde el final de la lista, en lugar del principio como un número positivo. Sin embargo, los objetos QuerySet aumentarán
AssertionError: Negative indexing is not supported.si usa un índice negativo, por lo que debe hacer lo que se dice en la página: revertir el orden y tomar el elemento
0th
.
Ten cuidado de usar
Edition.objects.order_by('-pub_date')[0]
ya que podría estar indexando un QuerySet vacío. No estoy seguro de cuál es el enfoque Pythonic correcto, pero el más simple sería envolverlo en un if / else o try / catch:
try:
last = Edition.objects.order_by('-pub_date')[0]
except IndexError:
# Didn't find anything...
Pero, como dijo @Harley, cuando realiza su pedido por fecha, latest ()
es la forma djangonic de hacerlo.
Esto ya se ha respondido, pero para más referencia, esto es lo que Django Book tiene que decir sobre el corte de datos en QuerySets:
Tenga en cuenta que no se admite la división negativa:
>>> Publisher.objects.order_by('name')[-1] Traceback (most recent call last): ... AssertionError: Negative indexing is not supported.
Sin embargo, esto es fácil de manejar. Solo cambia el order_by () declaración, como esta:
>>> Publisher.objects.order_by('-name')[0]
Consulte el enlace para más detalles de este tipo. Espero que ayude!