PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Django Rest Framework-Paginierung extrem langsame Zählung

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