Ho una pagina basata su un oggetto modello e desidero avere collegamenti alle pagine precedenti e successive. Non mi piace la mia soluzione attuale perché richiede la valutazione dell'intero queryset (per ottenere l'elenco ids
) e quindi altre due query get
. Sicuramente c'è un modo in cui questo può essere fatto in un solo passaggio?Come posso ottenere oggetti precedenti e successivi da un set di filtri, ordinato?
def get_prev_and_next_page(current_page):
ids = list(Page.objects.values_list("id", flat=True))
current_idx = ids.index(current_page.id)
prev_page = Page.objects.get(id=ids[current_idx-1])
try:
next_page = Page.objects.get(id=ids[current_idx+1])
except IndexError:
next_page = Page.objects.get(id=ids[0])
return (prev_page, next_page)
Ordina ordine definito nel modello, quindi non c'è bisogno di essere trattati qui, ma notare che non si può supporre che gli ID sono sequenziali.
Grazie, ero vagamente consapevole della Paginator, ma non avevo capito che ho potuto usarlo come quello (cioè con una soglia di 1, in effetti solo avvolgendo il queryset in un oggetto Paginator con i metodi 'has_next()', 'has_previous()'). L'unica cosa che manca è che non inizi all'inizio dell'intervallo di paginator, ma sembra che posso ottenere questo con 'p.object_list.index (start_page)'. –
Questo ha finito per non funzionare bene per me. La classe Paginator in realtà non è fatta per attraversare gli oggetti. –