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
Это позволит получить постраничные данные одним запросом, а затем мы проверим, есть ли хотя бы один элемент. Если это не так, мы знаем, что страница, которую мы используем, не должна существовать.