常见的需求:分页返回查询到的结果
一、pagination
分页类
使用rest framework
官方的pagination
分页引擎,提供了三种分页类:
1.PageNumberPagination
:根据页数进行分页
2.LimitOffsetPagination
:根据偏移量进行分页
3.CursorPagination
:根据游标进行分页
二、PageNumberPagination
:根据页数进行分页
2.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':3,
}
}
- 在视图类中使用分页引擎
步骤:
- a.先使用过滤引擎
- b.再使用分页引擎
使用之前使用了过滤引擎的获取所有project
的get
方法进行示例
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
2.2 在视图类中,指定分页引擎
- 在视图类指定分页引擎
# 1.导包
from rest_framework.pagination import PageNumberPagination
# 2.指定分页引擎
pagination_class = PageNumberPaginationManual
- 该视图类的其它代码如上面的2.1的2
三、自定义分页类
1.1 有这么几个需求
- 想要自定义页数的
key
,不想为page
,比如为currpage
- 想要前端自己想要每页显示多少页,就自己传递值过来,并且
key
为pagesize
1.2 方法:
写一个新的类,继承PageNumberPagination
类,在这个类的基础上进行修改
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
1.3 步骤:
在项目的util
目录,创建一个名为pagination.py
的文件
需求如上面所述,代码如下
在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'
)
}
- 请求该接口url
注意,上面设置了每页最多只能返回50
条数据,所以pagesize
不能大于50
# 查询name=测试,第二页,每页显示4条(也就是得到第5-8条)
http -v http://xxx/porojects/?name==测试&currpage=2&pagesize=4