19、Django_rest framework_分页引擎
2019-12-15 本文已影响0人
猪儿打滚
常见的需求:分页返回查询到的结果
一、pagination
分页类
使用rest framework官方的pagination
分页引擎,提供了三种分页类:
1.PageNumberPagination
:根据页数进行分页
2.LimitOffsetPagination
:根据偏移量进行分页
3.CursorPagination
:根据游标进行分页
二、PageNumberPagination
:根据页数进行分页
1.1 指定全局分页引擎
- 1.在settting.py中,指定全局分页引擎和每页返回的条数
REST_FRAMEWORK = {
"DEFAULT_RENDERER_CLASSES": (
"rest_framework.renderers.JSONRenderer",
"rest_framework.renderers.BrowsableAPIRenderer",
),
# 设置全局过滤引擎
'DEFAULT_FILTER_BACKENDS':[
'rest_framework.filters.OrderingFilter',
'django_filters.rest_framework.backends.DjangoFilterBackend'
],
# 设置全局分页引擎
'DEFAULT_PAGINATION_CLASS':[
# 设置分页引擎
'rest_framework.pagination.PageNumberPagination'
# 指定每页返回的条数
'PAGE_SIZE': 10
]
}
- 2.在视图类中使用分页引擎
- 步骤:
a.先使用过滤引擎
b.再使用分页引擎 - 使用之前使用了过滤引擎的获取所有project的get方法进行示例
def get(self, request):
# 建议调用get_queryset方法来获取查询集
project_qs = self.get_queryset()
# 对查询集进行过滤(使用的是上面类属性定义的过滤引擎),并覆盖,获取到的是经过排序后的查询集
project_qs = self.filter_queryset(project_qs)
## 使用paginate_queryset进行分页,返回的是分页后的查询集(如果没有指定分页引擎,那么返回的是None)
page = self.paginate_queryset(project_qs)
## 判断是否指定了分页引擎,指定了则返回分页后的数据,否则返回只经过过滤引擎处理后的数据
if page is not None:
serializer = self.get_serializer(instance=project_qs, many=True)
## 返回分页后的数据
return self.get_paginated_response(serializer.data)
# 建议使用get_serializer方法来获取序列化器
serializer = self.get_serializer(instance=project_qs, many=True)
# 响应返回;如果请求没有指定Accept,那么默认返回json
return Response(serializer.data, status=status.HTTP_200_OK)
- 3.请求该接口url
如果不指定页数,那么默认是第一页
http://xxx.xx.com/page==页数
或者http://xxx.xx.com/?page=页数
比如:
# 查询name=测试的第二页数据
http -v http://xxx/porojects/ name==测试 page=2
http -v http://xxx/porojects/?name==测试?page=2
1.2 在视图类中,指定分页引擎
- 1.在视图类指定分页引擎
# 1.导包
from rest_framework.pagination import PageNumberPagination
# 2.指定分页引擎
pagination_class = PageNumberPaginationManual
- 2.该视图类的其它代码如上面的1.1的2
三、自定义分页类
1.1 有这么几个需求
1.想要自定义页数的key,不想为page,比如为currpage
2.想要前端自己想要每页显示多少页,就自己传递值过来,并且key为pagesize
1.2 方法:
写一个新的类,继承PageNumberPagination
类,在这个类的基础上进行修改
1.3 步骤:
- 在项目的
util
目录,创建一个名为pagination.py
的文件 - 需求如上面所述,代码如下:
from rest_framework.pagination import PageNumberPagination
class PageNumberPaginationManual(PageNumberPagination):
# 当前页数的key从page修改为currpage
page_query_param = 'currpage'
# 默认每页显示的条数为2;page_size也是请求时的key
page_size = 2
# 把page_size修改为pagesize
page_size_query_param = 'pagesize'
# 分页的最大的page_size,每页不能显示超过50条
max_page_size = 50
- 在settting.py中,指定全局分页引擎,无需指定每页返回条数,由前端传参决定
REST_FRAMEWORK = {
"DEFAULT_RENDERER_CLASSES": (
"rest_framework.renderers.JSONRenderer",
"rest_framework.renderers.BrowsableAPIRenderer",
),
# 设置全局过滤引擎
'DEFAULT_FILTER_BACKENDS':[
'rest_framework.filters.OrderingFilter',
'django_filters.rest_framework.backends.DjangoFilterBackend'
],
# 设置全局分页引擎
'DEFAULT_PAGINATION_CLASS':[
# 设置自定义的分页引擎
'utils.PageNumberPaginationManual'
]
}
- 3.请求该接口url
注意,上面设置了每页最多只能返回50条数据,所以pagesize不能大于50
# 查询name=测试,第二页,每页显示4条(也就是得到第5-8条)
http -v http://xxx/porojects/?name==测试?currpage=2?pagesize=4