Django REST Framework: Запрос COUNT, генерируемый PageNumberPagination, работает медленно

Я не хочу выполнять запросы на подсчет в представлениях, где подсчет не нужен. Как я могу это отключить?

Я нашел следующее обходное решение в другом сообщении на stackoverflow. Запрос count не выполняется, но я могу видеть страницы, на которых нет данных. (Я могу видеть до ?page=10000, хотя есть только около 10 страниц.)

#settings.py
REST_FRAMEWORK = {
    "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination",
    "PAGE_SIZE": 20,
    ...
}
import sys

from django.core.paginator import Paginator
from django.utils.functional import cached_property
from rest_framework.pagination import PageNumberPagination

class CustomPaginatorClass(Paginator):
    @cached_property
    def count(self):
        return sys.maxsize

class CustomPagination(PageNumberPagination):
    django_paginator_class = CustomPaginatorClass

Вы можете выдать HTTP 404, если страница не содержит элементов с:

from rest_framework.exceptions import NotFound

class CustomPagination(PageNumberPagination):
    django_paginator_class = CustomPaginatorClass
    
    def paginate_queryset(self, queryset, request, view=None):
        data = super().paginate_queryset(queryset, request, view=view)
        if not data:
            raise NotFound('No data found for this page')
        return data

Это позволит получить постраничные данные одним запросом, а затем мы проверим, есть ли хотя бы один элемент. Если это не так, мы знаем, что страница, которую мы используем, не должна существовать.

Вернуться на верх