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. iptables 规则(Rules)

    iptables的每一条规则(rule),都是由两部分组成的,第一部分包含一或多个「过滤条件」其作用是检查包是否符合处理条件(所有条件都必须成立才算数) :第而部分称为「目标」,用於決定如何处置符合条 ...

  2. js循环遍历数组(对象)

    1,for循环 对于循环应该是最常用的一种遍历方式了,通常用来遍历数组结构. let arr = [a,b,d];for (let i=0; i<arr.length; i++){ consol ...

  3. 精选Pycharm里6大神器插件

    http://www.sohu.com/a/306693644_752099 上次写了一篇关于Sublime的精品插件推荐,有小伙伴提议再来一篇Pycharm的主题.相比Sublime,Pycharm ...

  4. 关于 FormData 和 URLSearchParams

    一.FormData FormData 接口提供了一种表示表单数据的键值对的构造方式,经过它的数据可以使用 XMLHttpRequest.send() 方法送出,本接口和此方法都相当简单直接.如果送出 ...

  5. const(每个对象中的常量), static const(类的编译时常量)

    1 每个对象中的常量 --- const数据成员 const限定,意味着“在该对象生命周期内,它是一个常量”. 关键字const 使被限定的量为常量 在该类的每个对象中,编译器都为其const数据成员 ...

  6. MySQL高级配置

    参考文章:http://www.jb51.net/article/47419.htm https://blog.csdn.net/waneto2008/article/details/52502208 ...

  7. siblings() 获得匹配集合中每个元素的同胞

    定义和用法 siblings() 获得匹配集合中每个元素的同胞,通过选择器进行筛选是可选的. 如果给定一个表示 DOM 元素集合的 jQuery 对象,.siblings() 方法允许我们在 DOM ...

  8. HTML DOM clearInterval() 方法

    定义和用法 clearInterval() 方法可取消由 setInterval() 设置的 timeout. clearInterval() 方法的参数必须是由 setInterval() 返回的 ...

  9. 2019-9-2-C#同步方法转异步

    title author date CreateTime categories C#同步方法转异步 lindexi 2019-09-02 12:57:37 +0800 2018-2-13 17:23: ...

  10. 用nodejs创建服务器显示html页面

    nodejs版本:v10.14.2 1.首先准备一个简单的html页面 <!DOCTYPE html> <html lang="en"> <head& ...