DRF 分页器的使用

 drf提供了三个内置分页器,根据前端需求选择使用。

全局配置

在配置文件中设置全局的分页方式,如:

REST_FRAMEWORK = {'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination','PAGE_SIZE': 100  # 每页数目
}

也可通过继承内置的分页器类自定义Pagination类,来为视图添加不同分页器。在视图中通过pagination_clas属性来指明。

class LargeResultsSetPagination(PageNumberPagination):page_size = 10page_query_param = 'page'page_size_query_param = 'size'max_page_size = 30class BookDetailView(RetrieveAPIView):queryset = BookInfo.objects.all()serializer_class = BookInfoSerializerpagination_class = LargeResultsSetPagination		# 局部指定使用分页器

注意:视图内局部设置不使用分页器

pagination_class = None

内置分页器的使用有两种方式,

  • 一种是直接使用内置的,在全局配置分页器的属性参数,控制分页的效果。
  • 一种是继承内置的分页器类,在继承的子类中设置分页器的属性参数,控制分页效果。

上述配置方式适用于内置的即继承内置的所有分页器的使用。需要注意的是基于APIView的视图需要自己手动添加分页器对象;基于ListAPIView的视图(继承GenericAPIView和视图插件的视图类以及视图集合类都可使用)仅通过参数pagination_class配置分页器即可使用。

PageNumberPagination

前端访问网址形式:

GET  http://127.0.0.1:8000/students/?page=4

可以在子类中定义的属性:

  • page_size 每页数目
  • page_query_param 前端发送的页数关键字名,默认为”page”
  • page_size_query_param 前端发送的每页数目关键字名,默认为None
  • max_page_size 前端最多能设置的每页数量
# APIView
from rest_framework.pagination import PageNumberPagination
# 一 基本使用:url=url=http://127.0.0.1:8000/pager/?page=2&size=3,size无效
class  Pager(APIView):def get(self,request,*args,**kwargs):# 获取所有数据ret=models.Book.objects.all()# 创建分页对象page=PageNumberPagination()# 在数据库中获取分页的数据page_list=page.paginate_queryset(ret,request,view=self)# 对分页进行序列化ser=BookSerializer1(instance=page_list,many=True)return Response(ser.data)# 二 自定制分页器类, url=http://127.0.0.1:8000/pager/?page=2&size=3
# size=30,无效,最多5条
class Mypage(PageNumberPagination):page_size = 2page_query_param = 'page'page_size_query_param = 'size'		 # 定制传参max_page_size = 5					# 每页最大的数据量class Pager(APIView):def get(self,request,*args,**kwargs):ret=models.Book.objects.all()page=Mypage()	# 创建分页对象page_list=page.paginate_queryset(ret,request,view=self)	# 在数据库中获取分页的数据ser=BookSerializer1(instance=page_list,many=True)	# 对分页进行序列化# return Response(ser.data)# 这个也是返回Response对象,但是比基本的多了上一页,下一页,和总数据条数(了解即可)return page.get_paginated_response(ser.data)# ListAPIView
# 声明分页的配置类,即可使用
from rest_framework.pagination import PageNumberPagination
class StandardPageNumberPagination(PageNumberPagination):page_size = 2page_size_query_param = "size"max_page_size = 10page_query_param = "p"class StudentAPIView(ListAPIView):queryset = Student.objects.all()serializer_class = StudentModelSerializerpagination_class = StandardPageNumberPagination		
# 127.0.0.1/four/students/?p=1&size=5

LimitOffsetPagination

前端访问网址形式:

GET http://127.0.0.1/four/students/?limit=100&offset=400

可以在子类中定义的属性:

  • default_limit 默认限制,默认值与PAGE_SIZE设置一直
  • limit_query_param limit参数名,默认’limit’
  • offset_query_param offset参数名,默认’offset’
  • max_limit 最大limit限制,默认None
# APIView
# http://127.0.0.1:8000/pager/?offset=4&limit=3
from rest_framework.pagination import LimitOffsetPagination
# 也可以自定制,同简单分页
class  Pager(APIView):def get(self,request,*args,**kwargs):# 获取所有数据ret=models.Book.objects.all()# 创建分页对象page=LimitOffsetPagination()# 在数据库中获取分页的数据page_list=page.paginate_queryset(ret,request,view=self)# 对分页进行序列化ser=BookSerializer1(instance=page_list,many=True)# return page.get_paginated_response(ser.data)return Response(ser.data)#ListAPIView
from rest_framework.pagination import LimitOffsetPagination
class StandardLimitOffsetPagination(LimitOffsetPagination):# 默认每一页查询的数据量,类似上面的page_sizedefault_limit = 2limit_query_param = "size"offset_query_param = "start"class StudentAPIView(ListAPIView):queryset = Student.objects.all()serializer_class = StudentModelSerializer# 调用页码分页类# pagination_class = StandardPageNumberPagination# 调用查询偏移分页类pagination_class = StandardLimitOffsetPagination

CursorPagination

这种分页方式只有上一页和下一页,不能跳跃切换页面,但是查询效率极高。

前端访问网址形式:

GET http://127.0.0.1/four/students/?cursor=cD0xNQ%3D%3D

可以在子类中定义的属性:

  • cursor_query_param:默认查询字段,不需要修改
  • page_size:每页数目
  • ordering:按什么排序,需要指定,逆序在字段前加负号:ordering='-id'
#APIView
from rest_framework.pagination import CursorPagination
# 看源码,是通过sql查询,大于id和小于id
class  Pager(APIView):def get(self,request,*args,**kwargs):# 获取所有数据ret=models.Book.objects.all()# 创建分页对象page=CursorPagination()page.ordering='nid'# 在数据库中获取分页的数据page_list=page.paginate_queryset(ret,request,view=self)# 对分页进行序列化ser=BookSerializer1(instance=page_list,many=True)# 可以避免页码被猜到return page.get_paginated_response(ser.data)# ListAPIView
class MyCursorPagination(CursorPagination):page_size=2ordering='-id'	
from rest_framework.generics import ListAPIView
class AuthorListView(ListAPIView):serializer_class = serializers.AuthorModelSerializerqueryset = models.Author.objects.filter(is_delete=False)pagination_class =MyCursorPagination

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/464830.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解 Nginx 插件及功能优化指南

深入理解 Nginx 插件及功能优化指南 深入理解 Nginx 插件及功能优化指南1. Nginx 插件介绍1.1 HTTP 模块插件ngx_http_rewrite_modulengx_http_access_module 1.2 过滤器插件ngx_http_gzip_modulengx_http_ssl_module 1.3 负载均衡插件ngx_http_upstream_modulengx_http_upstre…

【深度学习】手把手教你在远程服务器上跑 YOLOv3 相关代码(含环境配置)

前言 文章性质:实操记录 💻 主要内容:主要记录了如何配置项目环境以及如何在远程服务器上跑 yolov3 模型。 项目源码:GitHub - SZU-AdvTech-2022/213-Rethinking-Image-Restoration-for-Object-Detection 冷知识1:小伙…

【Linux】vim的基本操作与配置(下)

Hello everybody!今天我们继续讲解vim的操作与配置,希望大家在看过这篇文章与上篇文章后都能够轻松上手vim! 1.补充 在上一篇文章中我们说过了,在底行模式下set nu可以显示行号。今天补充一条:set nonu可以取消行号。这两条命令大家看看就可…

python+django+vue汽车票在线预订系统58ip7

本课题使用Python语言进行开发。基于web,代码层面的操作主要在PyCharm中进行,将系统所使用到的表以及数据存储到MySQL数据库中 使用说明 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 使用PyChar…

cad基础学习

基础操作与设置 切换工作空间 调整鼠标 界面右击,选项 选项中找到显示,十字光标调到最大 当然也可以输入命令op,回车。它会自动打开这个界面 画一个直线 上面选直接,单击俩个点,画出一个直线。然后空格收尾,这就画出…

电气器件系列四十九:室内加热器(取暖器)

这个的注意事项有好大一堆,有几个地方挺有意思的,可以了解一下。 第2条,查了一下,小太阳是真的可以把旁边的东西烤到很高的温度并起火 4、可能造成开关的损坏和发热管的损坏,插入异物可能吧加热管搞坏 5、小太阳是发…

FL Studio如何改变轨道颜色 FL Studio波形颜色如何自定义 flstudio21中文版下载 FL Studio 设置颜色

FL Studio如何改变轨道颜色?FL Studio的轨道颜色可以在播放列表或混音台界面进行修改。FL Studio波形颜色如何自定义?FL Studio的波形文件颜色、名称、图标等信息都是可以自定义的,下文将给大家详细讲述。 一、FL Studio如何改变轨道颜色 在…

【C语言——打印乘法口诀表】

乘法表: 我们可以定义一个i控制行的变化,外加看上图的表得知我们需要用到循环结构,i是行需要不停的加加,因此,for循环比较好用,可以用两个嵌套的循环,外层循环即用到的i表示的是每一行的打印&am…

C++ //练习 5.12 修改统计元音字母的程序,使其也能统计空格、制表符和换行符的数量。

C Primer(第5版) 练习 5.12 练习 5.12 修改统计元音字母的程序,使其也能统计空格、制表符和换行符的数量。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /******************************…

OpenCV基础

OpenCV简介 OpenCV是一个功能强大的开源计算机视觉和机器学习软件库,它在图像处理和视频分析领域得到了广泛应用。OpenCV最初由英特尔公司于1999年发起并支持,后来由Willow Garage和Itseez(现在是Intel的一部分)维护。它是为了推…

Arm发布新的人工智能Cortex-M处理器

Arm发布了一款新的Cortex-M处理器,旨在为资源受限的物联网(IoT)设备提供先进的人工智能功能。这款新的Cortex-M52声称是最小的、面积和成本效率最高的处理器,采用了Arm Helium技术,使开发者能够在单一工具链上使用简化…

android retrofit上传List集合数据

由于接口需要,retrofit上传不能用POST,因为FormUrlEncoded注解跟Body不能共存,所以更改成了QueryMap 因为需要传参,所先将图片集合转成了Hashmap集合,再使用Gson 将集合转成Json 字符串 ,再转成RequestBody 下面介绍一…