DRF框架中分页功能接口

一、在框架中提供来三个类来实现分页功能,PageNumberPagination、LimitOffsetPagination、CursorPagination

  1. PageNumberPagination是页码分页,这个类可以进行全局设置
  2. LimitOffsetPagination按照偏移量来进行分页
  3. 两个类都可以实现,在程序的具体设计上会有一部分的差别,但是差别不大。
  4. CursorPagination加密分页功能

二、使用PageNumberPagination类进行分页功能设计

Note

分页组件的基本逻辑:如果需要实现分页功能,首先需要从数据库中获得到所有的数据,正常情况下是获取到数据之后直接实例化序列化类,返回数据给前端。如果用到分页组件,必须在从数据库中获得到数据后,实例化序列化类之前对数据进行分页处理,再把处理后的数据作为instance的值进行传递。

  • 方式一:通过直接使用PageNumberPagination类来实现

      from rest_framework.pagination import PageNumberPagination
    class Page1View(APIView):
    user_obj = UserInfo.objects.all()
    # 获取所有的数据
    pg = PageNumberPagination()
    # 实例化分页类
    page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
    # 调用paginate_queryset方法对数据进行分页处理,参数有三个:
    #1. queryset是我们从数据库中取出的所有数据
    2.request=request
    3.view是处理分页的视图,本视图用self
    serializer = Page1Serializer(instance=page, many=True)
    return Response(serializer.data)
    # 实例化序列化类,并返回处理后的数据
  • 方式二:自定义分页类

      #自定义分页类,实现分页功能
    from rest_framework.pagination import PageNumberPagination
    # 创建分页类
    class MyPagination(PageNumberPagination):
    page_size = 1
    # 每页显示数据的数量
    max_page_size = 4
    # 每页最多可以显示的数据数量
    page_query_param = 'page'
    # 获取页码时用的参数
    page_size_query_param = 'size'
    # 调整每页显示数量的参数名 class Page2View(APIView):
    def get(self, request, *args, **kwargs):
    user_obj = UserInfo.objects.all()
    pg = MyPagination()
    page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
    serializer = Page1Serializer(instance=page, many=True)
    data = pg.get_paginated_response(serializer.data)
    # 自定义的分页类中实例化后使用get_paginated_response方法可以实现显示上下页链接的功能
    return data

Note

自定义的分页类继承PageNumberPagination类,在继承类的基础上添加设置,通过自定义类来处理原始的数据。page_size、max_page_size、page_size_query_param这三个是绑定在一起的,主要就是解决每一个中显示数据的数量,page_query_param主要解决的是获取页码的参数名,get_paginated_response实现的是添加上下页链接的功能,如果只想要数据,上下页链接的功能可以去掉,这样也会减少流量的消耗。

三、使用LimitOffsetPagination实现分页功能

这个类是实现分页功能基本和上一个类一致,不同的是get搜索时的参数名不同,这个类是根据当前的位置offset(默认为0,可以设置)和偏移量limit(即每页显示的数量)来进行查询的

  • 方式一:直接使用LimitOffsetPagination来实现

      from rest_framework.pagination import LimitOffsetPagination
    
      class Page3View(APIView):
    def get(self, request, *args, **kwargs):
    user_obj = UserInfo.objects.all()
    pg = LimitOffsetPagination()
    page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
    serializer = Page1Serializer(instance=page, many=True)
    return Response(serializer.data)

Note

查询时的url:http://127.0.0.1:8000/api/users/V1/page3view/?limit=1&offset=2

  • 自定义分页类实现分页功能

      # 自定义分页类来实现分页功能
    class MyPagination1(LimitOffsetPagination):
    default_limit = 1
    # 默认的每页查询的数据数量(偏移量)
    max_limit = 3
    # 每一页最大的数据数量
    offset_query_param = 'offset'
    # 开始进行分页的起始位置,默认为0
    limit_query_param = 'limit'
    # 查询数据时使用的参数 class Page4View(APIView):
    def get(self, request, *args, **kwargs):
    user_obj = UserInfo.objects.all()
    pg = MyPagination1()
    page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
    serializer = Page1Serializer(instance=page, many=True)
    data = pg.get_paginated_response(serializer.data)
    return data

四、继承CursorPagination类自定义分页类实现分页功能

Note

CursorPagination也可以被成为加密分页,会对页码进行加密处理,访问者无法通过修改页码来进行访问,这中方式相对于PageNumberPagination分页的优点是避免因用户任意修改页码,从而数据库查询数量过大,造成数据库过载和查询速度慢的问题,这个也是数据库查询性能优化,例如PageNumberPagination中用户可以直接将页码改为1000,而CursorPagination中只能查看上下页

    from rest_framework.pagination import CursorPagination

    class MyPagination2(CursorPagination):
page_size = 1
max_page_size = None
ordering = 'id'
# 按照id升序进行查询显示
page_size_query_param = None
cursor_query_param = 'cursor' class Page5View(APIView):
def get(self, request, *args, **kwargs):
user_obj = UserInfo.objects.all()
pg = MyPagination2()
page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
serializer = Page1Serializer(instance=page, many=True)
data = pg.get_paginated_response(serializer.data)
return data

DRF框架中分页功能接口的更多相关文章

  1. drf框架中分页组件

    drf框架中分页组件 普通分页(最常用) 自定制分页类 pagination.py from rest_framework.pagination import PageNumberPagination ...

  2. drf框架中所有视图及用法

    0909自我总结 drf框架中所有视图及用法 一.drf框架中的所有视图类 from django.views import View from rest_framework import views ...

  3. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

  4. django drf框架中的user验证以及JWT拓展的介绍

    登录注册是几乎所有网站都需要去做的接口,而说到登录,自然也就涉及到验证以及用户登录状态保存,最近用DRF在做的一个关于网上商城的项目中,引入了一个拓展DRF JWT,专门用于做验证和用户状态保存.这个 ...

  5. drf框架中jwt认证,以及自定义jwt认证

    0909自我总结 drf框架中jwt 一.模块的安装 官方:http://getblimp.github.io/django-rest-framework-jwt/ 他是个第三方的开源项目 安装:pi ...

  6. drf框架中认证与权限工作原理及设置

    0909自我总结 drf框架中认证与权限工作原理及设置 一.概述 1.认证 工作原理 返回None => 游客 返回user,auth => 登录用户 抛出异常 => 非法用户 前台 ...

  7. DRF框架中链表数据通过ModelSerializer深度查询方法汇总

    DRF框架中链表数据通过ModelSerializer深度查询方法汇总 一.准备测试和理解准备 创建类 class Test1(models.Model): id = models.IntegerFi ...

  8. DRF框架中的异常处理程序

    目录 DRF框架中自定义异常处理 一.自定义异常的原因 二.如何设置处理异常的程序 DRF框架中自定义异常处理 一.自定义异常的原因 在Django和DRF框架中都封装了很多的处理异常的程序,可以处理 ...

  9. java ssm框架实现分页功能 (oracle)

    java web 实现分页功能 使用框架:ssm 数据库:oracle 话说 oracle 的分页查询比 mysql 复杂多了,在这里简单谈一下: 查询 前十条数据: SELECT * FROM( S ...

随机推荐

  1. 14-1 jquery的dom操作和事件对象

    一 jquery的操作有,插入,修改,删除,克隆.具体见下方代码实例: <!DOCTYPE html> <html lang="en"> <head& ...

  2. es6 中let与const的简析

    1.let 它的作用类似于var,用来声明变量,但是所声明的变量,只在let命令所在的代码块内有效. if(true){ ; let b = ; } document.write(a); docume ...

  3. 威胁快报|新兴挖矿团伙借助shodan作恶,非web应用安全再鸣警钟

    近日,阿里云安全发现了一个使用未授权访问漏洞部署恶意Docker镜像进行挖矿的僵尸网络团伙.我们给这一团伙取名为Xulu,因为该团伙使用这个字符串作为挖矿时的用户名. Xulu并不是第一个攻击Dock ...

  4. 2019徐州网络赛 I.query

    这题挺有意思哈!!!看别人写的博客,感觉瞬间就懂了. 这道题大概题意就是,给一串序列,我们要查找到l-r区间内,满足min(a[ i ],a[ j ]) = gcd(a[ i ],a[ j ]) 其实 ...

  5. poj 3334 Connected Gheeves (Geometry + BInary Search)

    3334 -- Connected Gheeves 题意是,给出两个尖形的相连的容器,要求向其中灌水.它们具有日常的物理属性,例如两个容器中水平面高度相同以及水高于容器顶部的时候就会溢出.开始的时候打 ...

  6. 自然语言处理课程(二):Jieba分词的原理及实例操作

    上节课,我们学习了自然语言处理课程(一):自然语言处理在网文改编市场的应用,了解了相关的基础理论.接下来,我们将要了解一些具体的.可操作的技术方法. 作为小说爱好者的你,是否有设想过通过一些计算机工具 ...

  7. 解决Pycharm中SystemError报错

    报错描述- 代码逻辑大致是, 开启线程, 监听kafka生产者push的topic消息.- 问题出现在监听过程中, 线程在接收几条topic之后出现报错, 不再处理数据12报错代码Exception ...

  8. IDEA中安装activiti并使用

    1.IDEA中本身不带activiti,需要自己安装下载. 打开IDEA中File列表下的Settings 输入actiBPM,然后点击下面的Search...搜索 点击Install 下载 下载结束 ...

  9. HDU 2717 宽搜第一题、

    题意:求n到k的最小路径,  n有三种变法 n+1,n-1或者2*n: 贴个广搜的模版在这里把.... 总结一下:一般涉及到求最短路的话用宽搜 #include<iostream> #in ...

  10. Codeforces Round #186 (Div. 2)

    A. Ilya and Bank Account 模拟. B. Ilya and Queries 前缀和. C. Ilya and Matrix 考虑每个元素的贡献. 边长为\(2^n\)时,贡献为最 ...