首页 > 其他分享 >DRF分页器

DRF分页器

时间:2023-07-18 09:25:12浏览次数:32  
标签:分页 LimitOffsetPagination limit offset DRF page size

https://www.django-rest-framework.org/api-guide/pagination/

DRF给我们提供了几个分页器类,比较常用的2个是:

  • LimitOffsetPagination,基于offset 、limit参数来控制分页。
  • PageNumberPagination,基于page参数来控制分页。

只有当你使用GenericView或视图集ViewSet时才会自动进行分页。

设置分页类

全局设置

REST_FRAMEWORK = {
    # 注意:PAGE_SIZE 和 PAGINATION_CLASS 要一起设置,PAGE_SIZE=None也没有用...
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',  # 默认为None
    'PAGE_SIZE': 100  # 默认为None,这个参数只要为None,分页器就不会启用。
}

视图类局部设置

在视图类或者视图集中使用pagination_class属性可以覆盖全局设置的分页器类。

class UserModelViewSet(ModelViewSet):
    pagination_class = LimitOffsetPagination
    ...

LimitOffsetPagination使用

这个分页类的URL要求:

# 使用GET请求查询字符串参数limit、offset来进行分页。这两个查询字符串名可以改,需要自己继承LimitOffsetPagination修改。

GET https://api.example.org/accounts/?limit=100&offset=400

点开LimitOffsetPagination类可以看到下面的这些代码

"""
A limit/offset based style. For example: 

http://api.example.org/accounts/?limit=100
http://api.example.org/accounts/?offset=400&limit=100
"""
default_limit = api_settings.PAGE_SIZE  # 默认的limit值,可以看到是从settings.py中读取PAGE_SIZE选项的
limit_query_param = 'limit'             # 设置limit在请求url路由中的参数名
offset_query_param = 'offset'           # 设置offset在请求url路由中的参数名
max_limit = None                        **# 允许用户一次请求最大的limit值,我们需要继承这个类并重写这个属性。**
                                        # 不然别人给你来个1000000,你就查数据库就卡得一逼...
                                        
template = 'rest_framework/pagination/numbers.html'  # 这个是在DRF浏览API文档时使用的分页渲染的模板。一般用不着改。

自定义LimitOffsetPagination类

class MyLimitOffsetPagination(LimitOffsetPagination):
    # 限制用户最大的请求数量,一般可以从settings.py中读取,这里就暂时写死了
    max_limit = 5
    default_limit = 2

PageNumberPagination的使用

请求URL

GET https://api.example.org/accounts/?page=4

page参数是用来控制第几页。

PageNumberPagination默认是不允许客户端自己设置page_size的。除非你自己继承PageNumberPagination并重写相关类属性。

自定义PageNumberPagination

class MyPageNumberPagination(PageNumberPagination):
    # PageNumberPagination和LimitOffsetPagination都需要在settings.py设置PAGE_SIZE
    # 如果全局配置中没有设置,那么等同于分页功能关闭。
    # 但是,我们可以重写。
    # page_size = api_settings.PAGE_SIZE
    page_size = 4
    
    # 自定义请求分页的page的请求参数名
    page_query_param = "pg"
    # 那么就变成了:http://127.0.0.1:8000/people/?pg=2

    # 开启使用请求参数来控制page_size
    # http://127.0.0.1:8000/people/?pg=2&pg_size=10
    page_size_query_param = "pg_size"

    # 限制客户端可以请求的最大page_size,如果客户端请求大于这个值,则按照这个值来请求分页数据
    # 必须page_size_query_param为非None才有作用!
    max_page_size = 10

标签:分页,LimitOffsetPagination,limit,offset,DRF,page,size
From: https://www.cnblogs.com/juelian/p/17561854.html

相关文章

  • django分页器使用
    https://docs.djangoproject.com/en/3.2/topics/pagination/Django提供了高级和低级方法来帮助您管理分页数据——即,分成多个页面的数据,并带有“上一页/下一页”链接。Paginator类在底层,所有分页方法都使用Paginator类.可以为Paginator()提供列表/元组、DjangoQuerySet......
  • Datagridview 分页
       usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;namespaceLabSys_demo{publicpartialclassForm1:Form{......
  • Django+DRF+Vue 网页开发环境安装(windows/Linux)
    博客地址:https://www.cnblogs.com/zylyehuo/总览一、安装Djangopipinstalldjango==3.2二、安装MySQL驱动程序pipinstallpymysql三、安装DRFpipinstalldjangorestframework-ihttps://pypi.douban.com/simple四、安装Vue(一)脚本化引入<scriptsrc=......
  • JAVA实现多数据源分页
    简述下思路:举例:有A,B两个数据源的数据需要查询展示,优先展示A数据源数据,我使用的数据源是clickhouse+mysql1,因为需要优先展示A数据源嘛,那就直接通过条件优先查询A数据源数据2,然后根据分页情况,判断A数据源数据量是否满足当前分页所需数据量。   有以下三种情况:先获取当前......
  • 【补充】分页器推导
    【11.0补充】分页器推导【1.0】基础版后端defab_many(request):#分页操作推导#(1)支持切片models.Book.objects.all()[1:20]---展示前20条数据#(2)分页操作#想访问的页数current_page=request.GET.get('page',1)#如果获取不到当前页......
  • 自定义分页器模版
    【前言】当我们需要使用到非Django内置的第三方模块或者功能组件代码的时候我们一般情况下会创建一个名为utils的文件夹在该文件夹内对模块的功能进行划分项目根目录/utils/自定义文件特别注意:样式基于bootstrap,需要引入bootstrap配置【一】自定义分页器封装代码c......
  • SqlServer 分页 写法
    一、SELECT*FROM   (SELECTROW_NUMBER()OVER(ORDERBYid)ASRowId,*FROMArticle wherecidin(3,4,5,6,7,8,9,10,11,12))ASrWHERE RowId BETWEEN1and12 二、select*from(   select ROW_NUMBER()OVER(ORDERBYid)asrowid,* from  ......
  • dede列表页输入数字跳转到指定分页代码
    编辑打开列表页模板,默认路径为empletsdefaultlist_article.htm,将下列代码插入之间,也可以做JS调用。<scripttype="text/javascript">//<![CDATA[functiononCheckPage(){varbeginPage=parseInt(document.beginPagefrm.beginPage.value);if(isNaN(beginPage)){alert("请输......
  • U8凭证打印,启用新控件及强制分页处理
    1.启用新控件需要在选项中设置:2.然后在总账--凭证打印 套打设置如下:然后在打印预览设置时选择强制分面即可 ......
  • 同时处理列表分页加载功能和Reload功能经验
    功能背景:1. 首先我们这个列表它带有搜索功能2.左边是列表,右边为详情。3.页面上方有添加新项功能,会放到第一个。4.这是一个零件列表,同一个页面可以有无数个这种零件列表  第一,列表带有搜索功能,当搜索的发生改变时要将请求页数重置为1。这里我们应该如何做呢?当请......