Django REST Framework:PageNumberPagination 生成的 COUNT 查询很慢

Django REST Framework: COUNT query generated by PageNumberPagination is slow

我不想 运行 对不需要计数的视图的查询进行计数。 我怎样才能关闭它?

我在 Whosebug 上的另一个 post 中找到了以下解决方法。 计数查询未触发,但我可以看到没有数据的页面。 (我最多可以看到 ?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 <strong>not data</strong>:
            raise NotFound('No data found for this page')
        return data

这将通过一次查询获取分页数据,然后我们检查是否至少有一个元素。如果不是这样,我们知道我们正在使用的页面不应该存在。