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做实时目标检测