/ / Django-Paginierung ohne das ganze Queryset - Django, Optimierung

Django-Paginierung ohne das gesamte Anfrage-Set - Django, Optimierung

In Django verwende ich den Paginator wie folgt:

von django.core.paginator importieren Paginator, EmptyPage, PageNotAnInteger

def myView(request):
...
paginator = Paginator(Annonce.objects.filter(name="huhu"), 10)
paginator._count = s.count()
try:
annonces = paginator.page(page)
except PageNotAnInteger:
annonces = paginator.page(1)
except EmptyPage:
annonces = paginator.page(paginator.num_pages)

In der Funktion s.search () führe ich eine Abfrage für meine Postgres-Datenbank aus.

Es stellt sich heraus, dass die Abfrage auch bei einer Anzeige von 10 Elementen pro Seite nicht eingeschränkt ist.

Ich habe versucht, die Abfrage mit einem zu begrenzen Annonce.objects.filter(name="huhu")[:10] und die Zahl selbst angeben. Aber der Paginator funktioniert nicht, wenn ich das tue.

Gibt es eine Möglichkeit, dies zu optimieren?

Antworten:

10 für die Antwort № 1

Verwenden Sie dieses Beispiel https://docs.djangoproject.com/en/dev/topics/pagination/#using-paginator-in-a-view als Leitfaden zum Schreiben einer Ansichtsfunktion, die Django Paginator entsprechend verwendet.

Beachten Sie, dass in dem Beispielcode-Snippert -

def listing(request):
contact_list = Contacts.objects.all()
paginator = Paginator(contact_list, 25) # Show 25 contacts per page

page = request.GET.get("page")  # <--- This is the key to your solution.

contact_list ist ein zugewiesenes Queryset, das noch nicht ausgewertet wurde. Das paginator = Paginator(contact_list, 25) Zuordnung zu einem Paginator instance ist faul und wird nicht wirklich hingerichtet, bis es muss.

page = request.GET.get("page") erhält Ihre zusätzliche GET-Variable ?page=2 (als Beispiel) von Ihrer URL. Die URL würde tatsächlich so aussehen http://localhost:8000/my/listing?page=2 Wenn wir versuchen, die 25 Objekte abzurufen, die auf Ihrer Auflistungsseite angezeigt werden sollen, Seite 2.

Hier wird die eigentliche Abfrage an Ihre Datenbank ausgeführt: -

try:
contacts = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
contacts = paginator.page(1)

das contacts = paginator.page(page) führt eine Abfrage an die Datenbank aus Abrufen nur einer begrenzten Anzahl von Objekten basierend auf der Seitennummer und unter der Bedingung, dass wir "25" Objekte pro Seite wünschen.