PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Contagem extremamente lenta da paginação do Django Rest Framework


O problema é que a consulta usada para contar é a mesma potencialmente complexa usada para buscar os dados. Isso é um desperdício. PageNumberPagination usa o próprio Paginator do Django internamente.

Para tornar a consulta para a contagem mais simples, substitua a classe do paginador que o DRF usa:
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