Django REST framework 分页的实现代码
官方文档[这里]
用于分页的模块:Pagination
DjangoRESTframework有内置Pagination模块,无需额外安装,只需做简单的配置.
配置什么呢?就是告诉Django要用到什么样的分页样式,比如:返回哪些字段,每页的大小,请求参数的名称等等.
2种配置途径:
1.settings.py文件里做全局的配置
2.单独为每个需要分页的view分配自定义分页器.
途径1是为所有继承ListViewAPI的接口做默认配置,途径2对单独一个接口做个性化配置.
需要注意的是:途径1做了全局的配置,所有继承ListAPIView的接口,默认都会有分页.这会影响到现有接口返回数据的结构.除了这一点,途径1还是相当不错的.
我比较喜欢仅使用途径2,我可以自定义了一个通用型的分页器,只为有需要分页的view分配分页器,也是挺方便的.
途径1:settings.py文件里做全局配置
REST_FRAMEWORK={ #... 'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE':100 }
DEFAULT_PAGINATION_CLASS:默认分页器(BasePagination的子类).Django提供了3个类型:PageNumberPagination、LimitOffsetPagination、CursorPagination.不同类型返回的分页信息不同.也可以是你自定义的分页器.
PAGE_SIZE:分页大小.
途径2:自定义分页器
这里将示例使用自定义分页器的流程.
新建一个paginations.py用于写分页器:
我们在paginations.py文件里写一个通用的分页器:
classStandarPagination(PageNumberPagination): page_size=20#默认每页显示条数配置 page_query_param='page'#“页数”的请求参数名称,默认是page page_size_query_param='page_size'#“分页大小”的请求参数名称 #进入父类PageNumberPagination可看响应体返回字段. #defget_paginated_response(self,data): #returnResponse(OrderedDict([ #('count',self.page.paginator.count), #('next',self.get_next_link()), #('previous',self.get_previous_link()), #('results',data) #])) #觉得不适用,那就拷贝出来,重载函数,自己多加几个字段. #(可通过官方文档或直接调试得知从哪些属性获取正确的值.) defget_paginated_response(self,data): returnResponse(OrderedDict([ ('count',self.page.paginator.count), ('next',self.get_next_link()), ('previous',self.get_previous_link()), ('page',self.page.number), ('total_page',self.page.paginator.num_pages), ('page_size',self.page.paginator.per_page), ('results',data) ]))
(更多的属性介绍请查看文档)
为接口分配分页器,为属性pagination_class赋值即可.
fromrest_framework.paginationimportPageNumberPagination classMyListAPI(ListAPIView): queryset=TestModel.objects.filter() serializer_class=TestModelSerializer pagination_class=StandarPagination#新增
完成!
假如该接口请求地址是http://api/test/
看客户端是如何请求接口的:
http://api/test/:返回第一页,分页大小是20.
http://api/test/?page=2&page_size=10:返回第二页,分页大小是10.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。