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]
È stato utile?

Soluzione

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

Puoi anche semplificare le cose inserendo get_latest_by nella Meta del modello, quindi sarai in grado di farlo

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top