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

猜你喜欢

转载自www.cnblogs.com/ddzc/p/12148437.html