zoukankan      html  css  js  c++  java
  • DRF 分页

    DRF 分页

    DER分页

    • 作用:数据库有几千万条数据,这些数据需要展示,我们不可能直接从数据库把数据全部读取出来,这样会给内存造成特别大的压力,有可能还会内存溢出,所以我们希望一点一点的取,那展示的时候也是一样的,总是要进行分页显示,我们之前自己都写过分页。

    • 在数据量特别大的时候,我们的分页会越往后读取速度越慢,

      当有一千万条数据,我要看最后一页的内容的时候,怎么能让我的查询速度变快。

    • DRF提供的三种分页方式

      from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
      
    • 全局配置

      REST_FRAMEWORK = {
          'PAGE_SIZE': 2
      }
      

    一根据页码进行分页

    • 定义分页类
    class MyPageNumber(PageNumberPagination):
        page_size = 2  # 每页显示多少条
        page_size_query_param = 'size'  # URL中每页显示条数的参数
        page_query_param = 'page'  # URL中页码的参数
        max_page_size = None  # 最大页码数限制
    
    • view视图

      class BookView(APIView):
          def get(self, request):
              book_list = Book.objects.all()
              # 分页
              page_obj = MyPageNumber()
              page_article = page_obj.paginate_queryset(queryset=book_list, request=request, view=self)
              
              ret = BookSerializer(page_article, many=True)
              return Response(ret.data)
                  # 返回带超链接 需返回的时候用内置的响应方法
              # return page_obj.get_paginated_response(ret.data)
      

    二 位置和个数进行分类

    • 定义类

      class MyLimitOffset(LimitOffsetPagination):
          # 默认每页显示的数据条数
          default_limit = 10
          # URL中传入的显示数据条数的参数
          limit_query_param = 'limit'
          # URL中传入的数据位置的参数
          offset_query_param = 'offset'
          # 最大每页显得条数
          max_limit = None
      
    • 视图

      # 视图和上面的大体一致
      # 只有用的分页类不同,其他都相同
      class BookView(APIView):
          def get(self, request):
              book_list = Book.objects.all()
              # 分页
              page_obj = MyLimitOffset()
              page_article = page_obj.paginate_queryset(queryset=book_list, request=request, view=self)
      
              ret = BookSerializer(page_article, many=True)
              # return Response(ret.data)
              # 返回带超链接 需返回的时候用内置的响应方法
              return page_obj.get_paginated_response(ret.data)
      

    三 加密游标分页,把上一页和下一页的id记住

    • 定义类

      class MyCursorPagination(CursorPagination):
          # URL传入的游标参数
          cursor_query_param = 'cursor'
          # 默认每页显示的数据条数
          page_size = 2
          # URL传入的每页显示条数的参数
          page_size_query_param = 'page_size'
          # 每页显示数据最大条数
          max_page_size = 1000
      
          # 根据ID从大到小排列
          ordering = "id"
      
    • 视图

      class BookView(APIView):
          def get(self, request):
              book_list = Book.objects.all()
              # 实例化分页对象,获取数据库中的分页数据
              page_obj = MyCursorPagination()
              page_article = page_obj.paginate_queryset(queryset=book_list, request=request, view=self)
      		# 序列化对象
              ret = BookSerializer(page_article, many=True)
              return Response(ret.data)
          	# 生成分页和数据
              # 返回带超链接 需返回的时候用内置的响应方法
              # return page_obj.get_paginated_response(ret.data)
      
  • 相关阅读:
    greenplum 常用整理
    postgresql 常用整理
    数据源整理
    hive 以like方式建表(携带表结构)
    kudu 常用整理
    mysql常用整理
    Linux查看文件内容的常用方式(more,less,head,tail,cat)
    python2.7 安装docx错误
    python2.7 安装搜索引擎错误
    mysql数据库安装错误
  • 原文地址:https://www.cnblogs.com/yuncong/p/10129013.html
Copyright © 2011-2022 走看看