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]
¿Fue útil?

Solución

obj = Edition.objects.latest('pub_date')

También puede simplificar las cosas poniendo get_latest_by en el Meta del modelo, entonces podrás hacerlo

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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top