Come posso recuperare l'ultimo record in un determinato set di query?
Risposte:
EDIT: ora devi usare Entry.objects.latest('pub_date')
Potresti semplicemente fare qualcosa di simile, usando reverse()
:
queryset.reverse()[0]
Inoltre, fai attenzione a questo avviso dalla documentazione di Django:
... nota che
reverse()
generalmente dovrebbe essere chiamato solo su un QuerySet che ha un ordinamento definito (ad esempio, quando si interroga su un modello che definisce un ordinamento predefinito, o quando si usaorder_by()
). Se nessun tale ordinamento è definito per un datoQuerySet
, invocarloreverse()
non ha alcun effetto reale (l'ordinamento era indefinito prima della chiamatareverse()
e rimarrà indefinito in seguito).
latest(field_name=None)
restituisce l'ultimo oggetto nella tabella, per data, utilizzando il field_name fornito come campo della data.Questo esempio restituisce l'ultima voce nella tabella, in base al
pub_date
campo:
Entry.objects.latest('pub_date')
Il modo più semplice per farlo è:
books.objects.all().last()
Lo usi anche per ottenere la prima voce in questo modo:
books.objects.all().first()
books.objects.last()
e books.objects.first()
dovrebbe fare il trucco.
XYZ.objects.first()
e XYZ.objects.last()
Django> = 1.6
Aggiunti i metodi QuerySet first () e last () che sono metodi convenienti che restituiscono il primo o l'ultimo oggetto che corrisponde ai filtri. Restituisce Nessuno se non ci sono oggetti corrispondenti.
Per ottenere il primo oggetto:
ModelName.objects.first()
Per ottenere gli ultimi oggetti:
ModelName.objects.last()
Puoi usare il filtro
ModelName.objects.filter(name='simple').first()
Questo funziona per me.
Quando il set di query è già esaurito, puoi farlo per evitare un altro suggerimento db -
last = queryset[len(queryset) - 1] if queryset else None
Non usare try...except...
.
Django non lancia IndexError
in questo caso.
Lancia AssertionError
o ProgrammingError
(quando esegui python con l'opzione -O)
Se si utilizza django 1.6 e versioni successive, è molto più semplice ora che è stata introdotta la nuova API -
Model.object.earliest()
Fornirà latest () con direzione inversa.
ps - Conosco la sua vecchia domanda, postando come se qualcuno dovesse atterrare su questa domanda, conoscono questa nuova funzionalità e non finiscono per usare il vecchio metodo.
Puoi usare Model.objects.last()
o Model.objects.first()
. Se no ordering
è definito, il set di query viene ordinato in base alla chiave primaria. Se vuoi impostare la query sul comportamento dell'ordine, puoi fare riferimento agli ultimi due punti.
Se stai pensando di fare questo, Model.objects.all().last()
per recuperare l'ultimo e Model.objects.all().first()
per recuperare il primo elemento in un set di query o utilizzare filters
senza pensarci due volte. Quindi vedere alcuni avvertimenti di seguito.
La parte importante da notare qui è che se non ne hai incluso nessuno ordering
nel tuo modello, i dati possono essere in qualsiasi ordine e avrai un ultimo o un primo elemento casuale che non era previsto.
Per esempio. Supponiamo che tu abbia un modello denominato Model1
che ha 2 colonne id
e item_count
con 10 righe con ID da 1 a 10. [Non è definito alcun ordine]
Se prendi Model.objects.all (). Last () in questo modo, puoi ottenere qualsiasi elemento dalla lista di 10 elementi. Sì, è casuale in quanto non esiste un ordine predefinito.
Allora cosa si può fare?
ordering
base a qualsiasi campo o campi del modello. Ha anche problemi di prestazioni, per favore controlla anche quello. Rif: quiorder_by
durante il recupero. Come questo:Model.objects.order_by('item_count').last()
Il modo più semplice, senza doversi preoccupare dell'ordinamento corrente, è convertire il QuerySet in un elenco in modo da poter utilizzare la normale indicizzazione negativa di Python. Così:
list(User.objects.all())[-1]