47.DRF实现分页
分页Pagination
前端分页和后端分页的区别
前端分页
后端分页
如何选择分页
数据量比较小的时候建议一次性返回数据在前端进行分页,数据量庞大的话建议服务器分页单次请求单次返回
DRF中的分页
DRF中的分页介绍
- 将分页链接作为响应内容的一部分
- 响应头中包含分页链接,比如Content-Range或Link
- 可以通过将分页类设置None来选择是否关闭分页功能
自有分页VIew源码示例
# ListModelMixin源码 如果是常规view要实现分页,在视图中实现下述代码即可
class ListModelMixin:
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
# self.paginate_queryset对原有的queryset数据集进行分页
page = self.paginate_queryset(queryset)
# 如果页号不为空
if page is not None:
#返回对应页的数据
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
# 如果页号为空则返回全部数据
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
分页的settings设置
REST_FRAMEWORK = {
# drf的分页类位于rest_framework.pagination中
"DEFAULT_PAGINATION_CLASS":"",# 全局默认的指定分页类,如果视图想单独指定,与权限一样在view中单独设置
"PAGE_SIZE": #每一页显示多少数据
}
DRF中的分页类使用详解
BasePagination:

PageNumberPagination:
# settings.py
REST_FRAMEWORK = {
# 指定分页类为PageNumberPagination
"DEFAULT_PAGINATION_CLASS":"rest_framework.pagination.PageNumberPagination",
"PAGE_SIZE":3 #每一页显示3条数据
}
- 图1是没有设置分页时候的请求,返回全部6条数据
- 图2设置了分页后,默认不传page参数的请默认返回了第一页的数据
- 图3请求地址后加了page参数,page=2,则返回的是第二页的数据
- 也可以看出设置分页后response多了三个参数count是接口一共的数量,next是下一页的地址,previous是上一页地址

PageNumberPagination自定义分页类
from rest_framework import pagination
# 继承分页类
class PublicPagination(pagination.PageNumberPagination):
page_size = 2 # 每页显示的默认数据个数
page_query_param = 'page' # 页号,第几页的参数 ,比如定义为pages,那么请求分页的参数就应该是pages
page_size_query_param = 'page_size' # 自己指定每页显示多少个数
max_page_size = 100 # 最大允许设置的每页显示的数量
# last_page_strings用于指定表示请求最后一页的参数
# page=last的时候会直接到最后一页
# 如果不改参数的话,可以不用设置,不设置的话默认参数就是last
last_page_strings = 'last'
'''
自定义分页类
通过page_size指定默认的每页数据量,
page_size_query_param指定每页自定义的数据量的参数,如果请求page_size=4,则每页显示4个,否则走默认的2
max_page_size是允许设置的每页最大的数据量
'''
# 导入自定义的分页类
from .pagination import PublicPagination
class CategoryViewSet(ModelViewSet):
queryset = Category.objects.all()
serializer_class = CategorySerializer
# 指定自定义的分页类,与权限、限量等不同,每个视图只允许指定一个分页类
# 对指定视图设置分页类,会覆盖settings中默认的全局配置
pagination_class = PublicPagination
- 图1page=2,请求第二页的数据,返回2条,因为自定义分页类中的page_size覆盖了全局的page_size=3
- 图2没有指定page参数,默认返回第一页的两条数据
- 图3指定page=2,page_size=1,返回第二页的数据,用page_size指定1覆盖代码中设置的2,所以只显示1条数据

LimitOwsetPagination:
#view
class CategoryViewSet(ModelViewSet):
queryset = Category.objects.all()
serializer_class = CategorySerializer
# 给该指定LimitOffsetPagination分页类,也可以在settings指定全局
pagination_class = LimitOffsetPagination
- 图1,没有传参返回了3条数据是因为在settings中page_size是3,默认从第一条开始取3条数据,下一页依次向后取3条
- 图2是将settings中的page_size删除掉,没有传递limit和offset参数就默认全部返回
- 图3是传入limit=2,offset=2,从第三条开始取2条数据

LimitOwsetPagination自定义分页类
# 继承LimitOffsetPagination分页类
class PublicLimitOffsetPagination(pagination.LimitOffsetPagination):
default_limit = 2 # 用于指定默认的limit数量
limit_query_param = 'lm' # 指定请求时候对应的limit参数名,如果是lm那么传参就是lm=
offset_query_param = 'of' ## 指定请求时候对应的offset参数名,如果是lm那么传参就是of=
max_limit = 4 # 最大的limit可设置数量
CursorPagination:
CursorPagination分页类说明
- 显示一个正向和反向的控件,不允许我们任意导航到任意位置
- 要求结果集中有应该唯一的不变的排序方式
- 可以确保客户端在翻页时不会看到同一对象两次,即使在分页的同时有数据插入
- 对于超级大的数据量,使用前两个分页可能会效率低下,基于光标的分页具有固定的时间属性,不会因为数据变大而减慢
- 基于光标的分页的排序方式默认是使用created排序,如果使用默认排序则模型必须有created时间戳字段,首先显示最近添加的数据
- 可以覆盖pagination类的ordering属性,或者使用OrderingFilter过滤器类和CursorPagination来修改排序
- 使用时要注意应该有一个唯一不变的值,例如默认的created
#settings设置
REST_FRAMEWORK = {
# 指定CursorPagination分页类
"DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.CursorPagination",
"PAGE_SIZE": 2 # 每一页显示3条数据
}

自定义CursorPagination
#继承CursorPagination分页类
class PublicCursorPagination(pagination.CursorPagination):
ordering = '-created' #通过什么进行排序,默认created
page_size = 3 # 每页数据量
cursor_query_param = 'cs' #请求的参数字段,默认cursor

47.DRF实现分页的更多相关文章
- DRF的分页
DRF的分页 DRF的分页 为什么要使用分页 其实这个不说大家都知道,大家写项目的时候也是一定会用的, 我们数据库有几千万条数据,这些数据需要展示,我们不可能直接从数据库把数据全部读取出来, 这样 ...
- DRF框架(九)——drf偏移分页组件、drf游标分页组件(了解)、自定义过滤器、过滤器插件django-filter
drf偏移分页组件 paginations.py from rest_framework.pagination import LimitOffsetPagination class MyLimitOf ...
- drf偏移分页组件-游标分页-自定义过滤器-过滤器插件django-filter
drf偏移分页组件 LimitOffsetPagination 源码分析:获取参数 pahenations.py from rest_framework.pagination import Limit ...
- drf 的分页功能
1 settings中配置 page_size = 20 代表每页20条数据 REST_FRAMEWORK = { 'DEFAULT_PARSER_CLASSES': ( 'rest_framewor ...
- DRF之频率限制、分页、解析器和渲染器
一.频率限制 1.频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 2.频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通 ...
- DRF 分页组件
Django Rest Framework 分页组件 DRF的分页 为什么要使用分页 其实这个不说大家都知道,大家写项目的时候也是一定会用的, 我们数据库有几千万条数据,这些数据需要展示,我们不可能直 ...
- DRF频率、分页、解析器、渲染器
DRF的频率 频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通过自己定 ...
- DRF之注册响应分页组件
注册器 注册器的作用就是以后我们不用自己手动的一条条的敲路径了,它可以帮助哦们直接去找对应的路由,不用传参了,知道这一点就可以了,不多说还是,上代码实例 第一步:导入模块from django.url ...
- DRF框架(八)——drf-jwt手动签发与校验、搜索过滤组件、排序过滤组件、基础分页组件
自定义drf-jwt手动签发和校验 签发token源码入口 前提:给一个局部禁用了所有 认证与权限 的视图类发送用户信息得到token,其实就是登录接口,不然进不了登录页面 获取提交的username ...
- drf-jwt手动签发与校验,drf小组件:过滤、筛选、排序、分页
复习 """ 频率组件:限制接口的访问频率 源码分析:初始化方法.判断是否有权限方法.计数等待时间方法 自定义频率组件: class MyThrottle(SimpleR ...
随机推荐
- Python编程之定时任务(crontab)详解
引言 python-crontab是python模块,提供了对cron任务的访问,并使得我们可以通过python对crontab文件进行修改. 安装 pip install python-cronta ...
- RAID5 IO处理之replace代码详解
1 作用 从字面意思理解,replacement即是替换.我们知道硬盘都有一定的使用寿命,可以在硬盘失效之前通过该功能将就盘的数据迁移至新盘.因为replacement的流程是从旧盘中读出数据直接写入 ...
- DevOps|从特拉斯辞职风波到研发效能中的不靠谱人干的荒唐事
今天发生了一件大事特拉斯辞任英国首相,我想借着这件事情说下我看到的一件研发效能的荒唐事,这其中的关联也许就是「都用了不靠谱的人」. 两件事情 今儿一早就听到,2022年10月20日英国第78任首相伊丽 ...
- 基于LZO的高性能无损数据压缩IP
LZOAccel-C LZO Data Compression Core/无损数据压缩IP Core LZOAccel-C是一个无损数据压缩引擎的FPGA硬件实现,兼容LZO 2.10标准. Core ...
- Java多线程-线程生命周期(一)
如果要问我Java当中最难的部分是什么?最有意思的部分是什么?最多人讨论的部分是什么?那我会毫不犹豫地说:多线程. Java多线程说它难,也不难,就是有点绕:说它简单,也不简单,需要理解的概念很多,尤 ...
- maven-入门到入土
详情见代码重工:连接http://heavy_code_industry.gitee.io/code_heavy_industry/pro002-maven/
- Codeforces Round #828 (Div. 3) E2. Divisible Numbers (分解质因子,dfs判断x,y)
题目链接 题目大意 给定a,b,c,d四个数,其中a<c,b<c,现在让你寻找一对数(x,y),满足一下条件: 1. a<x<c,b<y<d 2. (x*y)%(a ...
- Nginx的概述和配置
一.Nginx概述 1.1Nginx的特点 (1)一款高性能.轻量级web服务 稳定性高 系统资源消耗低高 对HTTP并发连接的处理能力 (2)单台物理服务器可支持30000~50000个并发请求 1 ...
- perl中sprintf函数的用法
对于某些字符串,需要输入为特定的格式,通过sprintf可以很方便的完成,不需要专门进行其他处理. 转载 perl中sprintf函数的使用方法.
- 修改api-server支持的NodePort端口映射范围
创建svc资源报错显示:provided port is not in the valid range. The range of valid ports is 30000-32767 k8s集群默认 ...