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_datecampo: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 IndexErrorin questo caso.
Lancia AssertionErroro 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 filterssenza pensarci due volte. Quindi vedere alcuni avvertimenti di seguito.
La parte importante da notare qui è che se non ne hai incluso nessuno orderingnel 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 Model1che ha 2 colonne ide item_countcon 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?
orderingbase a qualsiasi campo o campi del modello. Ha anche problemi di prestazioni, per favore controlla anche quello. Rif: quiorder_bydurante 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]