Vấn đề là, truy vấn được sử dụng để đếm là truy vấn có khả năng phức tạp giống như được sử dụng để tìm nạp dữ liệu. Điều đó khá lãng phí. PageNumberPagination
sử dụng Paginator
của riêng Django trong nội bộ.
Để làm cho truy vấn về số lượng đơn giản hơn, hãy ghi đè lớp phân trang DRF sử dụng:
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