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
这将通过一次查询获取分页数据,然后我们检查是否至少有一个元素。如果不是这样,我们知道我们正在使用的页面不应该存在。
我不想 运行 对不需要计数的视图的查询进行计数。 我怎样才能关闭它?
我在 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
这将通过一次查询获取分页数据,然后我们检查是否至少有一个元素。如果不是这样,我们知道我们正在使用的页面不应该存在。