Django rest framework 之分页
Django rest_framework 中分页可分为三类:
- PageNumberPagination:看第 n 页,每页显示 n 条数据
- LimitOffsetPagination:在 n 个位置,向后查看 n 条数据
- CursorPagination:加密分页,只能看上一页和下一页
一、PageNumberPagination
在这里将采用 rest_framework 内置的页面渲染器 Response。
1、api/serializers.py
class PagesSerializers(serializers.ModelSerializer):
"""分页"""
class Meta:
model = models.Role
fields = '__all__'
2、api/views.py
from rest_framework.response import Response # 渲染器
from .serializers import PagesSerializers
from app import models
from rest_framework.pagination import PageNumberPagination
class PageView(APIView):
"""分页"""
def get(self, request, *args, **kwargs):
"""示例:
http://api.example.org/accounts/?page=4
http://api.example.org/accounts/?page=4&page_size=100
"""
roles = models.Role.objects.all()
# 创建分页对象
pg = PageNumberPagination()
# 获取分页数据
page_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
# 将分页后的数据序列化
roles_ser = PagesSerializers(instance=page_roles, many=True)
# 将序列化后的数据渲染到前端显示,这里采用的是 rest_framework 的渲染器 Response
return Response(roles_ser.data)
3、api/urls.py
from django.urls import path, re_path
from api.views import UserView, ParserView, RolesView, UserInfoView, GroupView, UserGroupView, PageView
urlpatterns = [
re_path('(?P<version>[v1|v2]+)/pages/', PageView.as_view()), # 分页
]
4、另外需要配置每页显示的条数 settings.py
REST_FRAMEWORK = {
"DEFAULT_VERSION": 'v1', # 默认的版本
"ALLOWED_VERSIONS": ['v1', 'v2'], # 允许的版本
"VERSION_PARAM": 'version', # GET方式url中参数的名字 ?version=xxx
"PAGE_SIZE": 2, # 每页最多显示两条数据
}
5、访问(第二页数据):http://127.0.0.1:8000/api/v2/pages/?page=2

自定义分页
定义一个类,让它继承 PageNumberPagination
1、api/views.py
class MyPageNumberPagination(PageNumberPagination):
"""自定义分页类"""
page_size = 2 # 每页最多显示的条数
page_query_param = 'page' # 查询参数,URL 中的过滤参数
# 通过 page_size 每页只显示 2 条,使用下面这个参数可以改变默认显示条数
# 使用方法 http://127.0.0.1:8000/api/v2/pages/?page=2&size=3
page_size_query_param = 'size'
max_page_size = 10 # 最大页数
class PageView(APIView):
"""分页"""
def get(self, request, *args, **kwargs):
"""
http://api.example.org/accounts/?page=4
http://api.example.org/accounts/?page=4&page_size=100
"""
roles = models.Role.objects.all()
# 创建分页对象
# pg = PageNumberPagination()
pg = MyPageNumberPagination()
# 获取分页数据
page_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
# 将分页后的数据序列化
roles_ser = PagesSerializers(instance=page_roles, many=True)
# 将序列化后的数据渲染到前端显示,这里采用的是 rest_framework 的渲染器 Response
return Response(roles_ser.data)
2、访问:http://127.0.0.1:8000/api/v2/pages/?page=2&size=1

二、LimitOffsetPagination
LimitOffsetPagination 可以控制只查看多少条,以及偏移量 offset 后多少条数据,格式为:
http://api.example.org/accounts/?limit=100 # 控制查看 100 条数据
http://api.example.org/accounts/?offset=400&limit=100 # 偏移量 400,查看条数 100,即查看 400 后的 100 条数据
使用方法与 PageNumberPagination 一致:
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination
class PageView(APIView):
"""分页"""
def get(self, request, *args, **kwargs):
"""
http://api.example.org/accounts/?page=4
http://api.example.org/accounts/?page=4&page_size=100
"""
roles = models.Role.objects.all()
# 创建分页对象
# pg = PageNumberPagination()
# pg = MyPageNumberPagination()
pg = LimitOffsetPagination()
# 获取分页数据
page_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
# 将分页后的数据序列化
roles_ser = PagesSerializers(instance=page_roles, many=True)
# 将序列化后的数据渲染到前端显示,这里采用的是 rest_framework 的渲染器 Response
return Response(roles_ser.data)
查看第 2 条数据后的 3 条数据:

自定义
同样地 LimitOffsetPagination 也支持自定义:
#自定义分页类2
class MyLimitOffsetPagination(LimitOffsetPagination):
#默认显示的个数
default_limit = 2
#当前的位置
offset_query_param = "offset"
#通过limit改变默认显示的个数
limit_query_param = "limit"
#一页最多显示的个数
max_limit = 10
get_paginated_response() 方法控制前后页面
api/views.py
class PageView(APIView):
"""分页"""
def get(self, request, *args, **kwargs):
"""
http://api.example.org/accounts/?page=4
http://api.example.org/accounts/?page=4&page_size=100
"""
roles = models.Role.objects.all()
# 创建分页对象
# pg = PageNumberPagination()
# pg = MyPageNumberPagination()
pg = LimitOffsetPagination()
# 获取分页数据
page_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
# 将分页后的数据序列化
roles_ser = PagesSerializers(instance=page_roles, many=True)
# 将序列化后的数据渲染到前端显示,这里采用的是 rest_framework 的渲染器 Response
# return Response(roles_ser.data)
return pg.get_paginated_response(roles_ser.data) # 这一行
效果如下:

三、CursorPagination
CursorPagination 将页码进行加密,使得不能通过 URL 来控制显示的页面
1、这里使用自定义分页类 api/views.py
class MyCursorPagination(CursorPagination):
"""自定义分页类"""
page_size = 2 # 每页最多显示的条数
cursor_query_param = 'cursor' # 查询参数,URL 中的过滤参数
ordering = 'id' # 通过什么排序(正序)
page_size_query_param = None
max_page_size = None # 最大页数
class PageView(APIView):
"""分页"""
def get(self, request, *args, **kwargs):
"""
http://api.example.org/accounts/?page=4
http://api.example.org/accounts/?page=4&page_size=100
"""
roles = models.Role.objects.all()
# 创建分页对象
# pg = PageNumberPagination()
# pg = MyPageNumberPagination()
# pg = LimitOffsetPagination()
pg = MyCursorPagination()
# 获取分页数据
page_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
# 将分页后的数据序列化
roles_ser = PagesSerializers(instance=page_roles, many=True)
# 将序列化后的数据渲染到前端显示,这里采用的是 rest_framework 的渲染器 Response
# return Response(roles_ser.data)
return pg.get_paginated_response(roles_ser.data)
2、访问: http://127.0.0.1:8000/api/v2/pages/

Django rest framework 之分页的更多相关文章
- Django Rest framework 之 分页
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- django rest framework实现分页功能
在web开发中很多需求都需要实现分页功能,然而 Django Rest Framework 自带的分页功能,只能在 mixins.ListModelMixin and generics.Generic ...
- Django REST framework的分页
DRF分页组件 为什么要使用分页 我们数据表中可能会有成千上万条数据,当我们访问某张表的所有数据时,我们不太可能需要一次把所有的数据都展示出来,因为数据量很大,对服务端的内存压力比较大还有就是网络传输 ...
- Django REST framework 之分页,视图,路由,渲染器
1.分页 2.视图 3.路由 4.渲染器 1.分页 方法一: from django.shortcuts import render from rest_framework.versioning im ...
- Django Rest framework 之 序列化
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- Django Rest framework 之 解析器
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- Django Rest framework 之 版本
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- Django Rest framework 之 节流
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- Django Rest framework 之 权限
django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) django res ...
随机推荐
- 【AGC009E】Eternal Average
[AGC009E]Eternal Average 题面 洛谷 题解 神仙题.jpg 我们把操作看成一棵\(k\)叉树,其中每个节点有权值,所有叶子节点(共\(n+m\)个)就是\(0\)或\(1\). ...
- Nuxt.js中scss公用文件(不使用官方插件style-resources)
项目多多少少应该都遇到有公用文件这种情况,比如说偶尔某一天产品来找你,能不能明天把网站的这个颜色给我改下?第二天再来给我换回来? 如果再css2.x时代,不使用css预处理技术,这一改只能“查找替换” ...
- vb.net 读取 excel
Dim myConn AsNew ADODB.Connection myConn.CursorLocation = ADODB.CursorLocationEnum.adUseClient ' 用 ...
- python总结二
1.在命令行:dd是删除光标所在的那一整行 yy是复制光标所在的那一整行 p是将已复制的数据在光标的下一行粘贴 P是将已复制的数据在光标的上一行粘贴 2.在命令行中查找的话 从上往下查找:/ 从下往上 ...
- 每日一问:说说你对 LeakCanary 的了解
昨天的问题说到了关于 内存泄漏需要注意的点,在文章最后有说到 LeakCanary 检测内存泄漏.实际上,我相信绝大多数人也知道甚至使用过这个库. 这个系列通常来说如果发现了不错的资源,会选择直接截取 ...
- vue子组件如何向父组件传值
子组件: <template> <div class="app"> <input @click="sendMsg" type=&q ...
- c语言之函数指针应用
c语言之函数指针应用 1.函数指针与指针函数 在开始运用函数指针前,我们需要将两个概念即:函数指针与指针函数搞清楚. 函数指针,指明这个一个函数,但返回值为指针类型,语法格式为: 类型名* 函数名A( ...
- 关于央行数字货币DCEP的几个特点的思考(转)
近期,央行即将推出数字货币,无论在金融领域还是在资本市场,央行数字货币这一话题都被炒的很火热.央行研发的数字货币叫做DCEP(DC,DigitalCurrency,是数字货币:EP,Electroni ...
- 《Linux就该这么学》培训笔记_ch10_使用Apache服务部署静态网站
<Linux就该这么学>培训笔记_ch10_使用Apache服务部署静态网站 文章最后会post上书本的笔记照片. 文章主要内容: 网站服务程序 配置服务文件参数 SELinux安全子系统 ...
- .Net Core 基于 SnmpSharpNet 开发
SNMP简介(百度百科): SNMP 是专门设计用于在 IP 网络管理网络节点(服务器.工作站.路由器.交换机及HUBS等)的一种标准协议,它是一种应用层协议. SNMP 使网络管理员能够管理网络效能 ...