Bob's Blog

Python、Web开发、测试框架、自动化平台、机器学习等

返回上页首页

Django Restframework自定义修改局部的分页设置



在用到Django Restframework时,有时会遇到需要临时修改分页设置的需求。比如默认是分页数为10,有api请求是需求能一次性展示所有的结果,或者是展示较大数量的结果,但又不希望影响全局的这个设置。可以用如下的修改方式。

首先在settings.py中有全局的设置,代表着全局的api返回结果以10条为分页基数:

REST_FRAMEWORK = {
    ...
    'PAGE_SIZE': 10,
    ...
}

但是呢,现在需要一次性返回所有的书本信息,10条肯定不够,又不可能重复循环的改变page参数(?page=2之类的),太浪费资源和时间。

于是我们可以做一个自定义的分页对象:

from rest_framework.pagination import PageNumberPagination

class LargeResultsSetPagination(PageNumberPagination):
    page_size = 100
    page_size_query_param = 'page_size'
    max_page_size = 100000

然后在api view的对象里指明使用这个分页对象:

class BookList(generics.ListCreateAPIView):
    serializer_class = BookSerializer
    filter_backends = [filters.SearchFilter]
    search_fields = ["name"]
    pagination_class = LargeResultsSetPagination  #这里

然后再次请求book时,会看到默认是以100条为分页基数来显示结果,并且因为这里设置了page_size_query_param,代表着可以在url中使用page_size来方便地自定义分页基数(?page_size=1001; 默认的PageNumberPagination中的page_size_query_param为None),且最高能设置到100000。这就很方便得实现了需求,且不影响其他的api view。

如果想沿用全局的默认分页基数,只是想支持page_size这个参数在url中生效,那么就改成下面的样子:

from automation_center.settings import REST_FRAMEWORK as rf
from rest_framework.pagination import PageNumberPagination

class LargeResultsSetPagination(PageNumberPagination):
    page_size = rf["PAGE_SIZE"]
    page_size_query_param = 'page_size'
    max_page_size = 100000

(另外也可以粗暴地设置pagination_class=None,那么就不会应用分页设置。但是需要注意的是,此时返回的api response的结构有变化,是直接返回所有结果,不带有next 、 results等字段,取值时需要注意一下。)

下一篇:  用YOLO做实时目标检测
上一篇:  Django DRF根据model的字段动态限制另一字段的内容

共有0条评论

添加评论

暂无评论