In django, come posso ordinare un modello su un campo e quindi ottenere l'ultimo elemento?
-
05-07-2019 - |
Domanda
In particolare, ho un modello che ha un campo come questo
pub_date = models.DateField("date published")
Voglio essere in grado di afferrare facilmente l'oggetto con l'ultimo pub_date
. Qual è il modo più semplice / migliore per farlo?
Qualcosa del tipo farebbe ciò che voglio?
Edition.objects.order_by('pub_date')[:-1]
Soluzione
obj = Edition.objects.latest('pub_date')
Puoi anche semplificare le cose inserendo
obj = Edition.objects.latest()
Vedi i documenti per maggiori informazioni. Probabilmente vorrai anche impostare ordering
Opzione Meta.
Altri suggerimenti
La risposta di Harley è la strada da percorrere per il caso in cui si desidera l'ultimo in base ad alcuni criteri di ordinazione per determinati modelli, come si fa, ma la soluzione generale è invertire l'ordine e recuperare il primo articolo:
Edition.objects.order_by('-pub_date')[0]
Nota:
Gli elenchi di pitone normali accettano indici negativi, che indicano un offset dalla fine dell'elenco, anziché l'inizio come un numero positivo. Tuttavia, gli oggetti QuerySet genereranno
AssertionError: Negative indexing is not supported.se si utilizza un indice negativo, motivo per cui è necessario eseguire le operazioni indicate: invertire l'ordine e prendere l'elemento
0th
.
Fai attenzione a usare
Edition.objects.order_by('-pub_date')[0]
poiché potresti indicizzare un QuerySet vuoto. Non sono sicuro di quale sia l'approccio Pythonic corretto, ma il più semplice sarebbe avvolgerlo in un if / else o provare / catturare:
try:
last = Edition.objects.order_by('-pub_date')[0]
except IndexError:
# Didn't find anything...
Ma, come ha detto @Harley, quando ordini per data, latest ()
è il modo djangonic per farlo.
Questa è già stata risolta, ma per ulteriori riferimenti, questo è ciò che Django Book ha da dire su Slicing Data on QuerySet:
Si noti che il slicing negativo non è supportato:
>>> Publisher.objects.order_by('name')[-1] Traceback (most recent call last): ... AssertionError: Negative indexing is not supported.
Questo è facile da aggirare, però. Basta cambiare order_by () dichiarazione, in questo modo:
>>> Publisher.objects.order_by('-name')[0]
Fai riferimento al link per ulteriori dettagli. Spero che ti aiuti!