DRF框架中分页功能接口

目录

  • DRF框架中分页功能接口

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

原文地址:https://www.cnblogs.com/ddzc/p/12148437.html

时间: 2024-07-31 18:54:28

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

drf框架中分页组件

0922自我总结 drf框架中分页组件 普通分页(最常用) 自定制分页类 pagination.py from rest_framework.pagination import PageNumberPagination # 普通分页 class CarPageNumberPagination(PageNumberPagination): # 默认一页的条数 page_size = 3 # 用户可以自定义选择一页的条数,但最多显示5条 page_size_query_param = 'page_s

DRF框架中其他功能:认证、权限、限流

定义视图时,只要视图继承了APIView或其子类,就可以使用DRF框架的认证.权限和限流功能. 当客户端访问API接口时,DRF框架在调用对应的API接口之前,会依次进行认证.权限和限流的操作. 认证Authentication 权限Permissions 限流Throttling 原文地址:https://www.cnblogs.com/oklizz/p/11290731.html

【转】【译】JavaScript魔法揭秘--探索当前流行框架中部分功能的处理机制

推荐语: 今天推荐一篇华为同事的同事翻译的一篇文章,推荐的主要原因是作为一个华为员工居然晚上还能写文章,由不得小钗不佩服!!! 其中的jQuery.angular.react皆是十分优秀的框架,各有特点,各位可以看看 编辑:github 原文链接:Revealing the Magic of JavaScript jnotnull发布在 JavaScript译文 我们每天都在使用大量的工具,不同的库和框架已经成为我们日常工作的一部分.我们使用他们是因为我们不想重新造轮子,虽然我们可能并不知道这些

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

登录注册是几乎所有网站都需要去做的接口,而说到登录,自然也就涉及到验证以及用户登录状态保存,最近用DRF在做的一个关于网上商城的项目中,引入了一个拓展DRF JWT,专门用于做验证和用户状态保存.这个拓展比传统的CSRF更加安全.先来介绍一下JWT认证机制吧! Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景.JWT的声明一般被用来在身

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

0909自我总结 drf框架中jwt 一.模块的安装 官方:http://getblimp.github.io/django-rest-framework-jwt/ 他是个第三方的开源项目 安装:pip install djangorestframework-jwt 使用自带设定好的jwt from django.urls import path from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [ path(

yii中分页功能的使用

CDbCriteria就是这个类包的使用,这个类包是yii自带专门用来处理类似分类这样的功能的.而我们使用yii框架然后调用这个方法会起到事半功倍的效果,会发现使用这个能够节省很多的时间,让你快速的使用PHP中分页的功能. 还要使用的一个类包就是CPagination,具体的元素属性就不解释了,可以直接连接过去看API 第一步: 在控制器里面加上一下的代码: $criteria = new CDbCriteria(); $criteria->alias = 'post';//要查询表的别名 $c

DRF框架中csrf异常

一.报错信息 "detail": "CSRF Failed: CSRF cookie not set." 二.解决办法 方法一: 在配置文件中配置 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', ) } 方法二.在提交信息中加上csrf_token: 页面form框中设置 {% csrf_token

drf框架--基础

目录 drf框架 导入 什么是接口 restful接口规范 原生Django实现接口 drf框架 Django CBV 和drf CBV对比 响应渲染模块 请求数据解析模块 响应模块 drf框架 导入 http协议 http协议是基于应用层的协议 在发出请求时,需要具备请求首行,请求头,请求体 特点:无状态无连接,且都是客户端先发起请求,服务端再进行响应 wsgi协议 主要就是规定了数据的解析方式,把get之类的http请求解析封装到request里面 在视图函数返回的时候,再把数据打包成htt

drf框架相关

drf框架: django-rest framework 1.接口:联系两个物质的媒介,完成信息交互 web程序中:联系前台页面与后台数据库的媒介,已完成信息的交互; web接口组成: url:长得像放回数据的url链接 请求参数:前台按照指定的key提供数据给后台 响应数据:后台与数据库交互后将数据反馈给前台 2.restful接口规范 -> 规范化书写接口 定义:为了采用不同的后台语言,也能用同样的接口来获取到同样的数据; 接口文档: 写接口要写 url,响应数据 注:如果将请求参数也纳入考