Ich habe eine Seite basierend auf einem Modellobjekt, und ich möchte Links zu den vorherigen und nächsten Seiten haben. Ich mag meine aktuelle Lösung nicht, weil sie das gesamte Abfrage-Set auswerten muss (um die ids
Liste zu erhalten), und dann zwei weitere get
Abfragen. Sicherlich gibt es eine Möglichkeit, dies in einem Durchgang zu machen?Wie kann ich vorherige und nächste Objekte aus einem gefilterten, geordneten Abfrage-Set abrufen?
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)
Sortierung wird im Modell definiert sind, so hier nicht behandelt werden muss, aber beachten Sie, dass man nicht davon ausgehen kann, dass ids sequentiell sind.
Dank war ich vagee Kenntnis von der Paginator, hatte aber nicht bemerkt, dass ich es so, dass (dh mit einem Schwellenwert von 1, in der Tat nutzen könnte nur die queryset in einem Paginatorobjekt Einwickeln mit den 'has_next()', 'has_previous()' Methoden). Es fehlt nur, dass ich nicht am Anfang des Paginator-Bereichs beginne, aber es sieht so aus, als könnte ich das mit 'p.object_list.index (start_page)' erreichen. –
Das endete nicht gut für mich. Die Paginator-Klasse ist wirklich nicht zum Durchqueren von Objekten geeignet. –