Das Problem ist, dass die zum Zählen verwendete Abfrage die gleiche potenziell komplexe Abfrage ist, die zum Abrufen der Daten verwendet wird. Das ist ziemlich verschwenderisch. PageNumberPagination
verwendet Djangos eigenen Paginator
intern.
Um die Abfrage nach der Anzahl zu vereinfachen, wird die Paginator-Klasse von DRF überschrieben:
from django.core.paginator import Paginator
from django.utils.functional import cached_property
from rest_framework.pagination import PageNumberPagination
class FasterDjangoPaginator(Paginator):
@cached_property
def count(self):
# only select 'id' for counting, much cheaper
return self.object_list.values('id').count()
class FasterPageNumberPagination(PageNumberPagination):
django_paginator_class = FasterDjangoPaginator