Tengo una página basada en un objeto modelo, y quiero tener enlaces a las páginas anterior y siguiente. No me gusta mi solución actual porque requiere evaluar todo el conjunto de consultas (para obtener la lista ids
) y luego dos consultas más de get
. Seguramente hay alguna forma en que esto se puede hacer en una sola pasada.¿Cómo puedo obtener objetos anteriores y siguientes de un queryset filtrado y ordenado?
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)
Orden de clasificación se define en el modelo, por lo que no tiene que ser manejado aquí, pero tenga en cuenta que no se puede asumir que los identificadores son secuenciales.
Gracias, yo era vagamente consciente de la Paginator, pero no había dado cuenta de que podría utilizar de esa manera (es decir, con un umbral de 1, de hecho acaba de envolver el conjunto de consultas en un objeto Paginator con los métodos 'has_next()', 'has_previous()'). Lo único que falta es que no empiezo al principio del rango del paginador, pero parece que puedo obtenerlo con 'p.object_list.index (start_page)'. –
Esto no funcionó bien para mí. La clase Paginator realmente no está hecha para atravesar objetos. –