【问题标题】:Django REST Framework: COUNT query generated by PageNumberPagination is slowDjango REST Framework:PageNumberPagination 生成的 COUNT 查询很慢
【发布时间】:2022-01-08 11:25:17
【问题描述】:

我不想对不需要计数的视图运行计数查询。 如何关闭它?

我在另一篇关于 stackoverflow 的帖子中找到了以下解决方法。 计数查询未触发,但我可以看到没有数据的页面。 (我最多可以看到 ?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

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    如果页面不包含以下任何元素,您可以引发 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

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

    【讨论】:

    • 我希望第一页返回空数据,但不是像最初那样的404错误,我该怎么写?
    猜你喜欢
    • 2022-11-18
    • 1970-01-01
    • 2021-12-13
    • 2021-04-24
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多