zoukankan      html  css  js  c++  java
  • 07,分页

    Django在处理分页的方式上有很多,原生的Paginator可以、第三方模块pure-paginator也行。当然了在django rest-framework接口的设计中,django也为我们提供了三种分页的方案。

    from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination 

    1、PageNumberPagination

    例如:http://127.0.0.1:8000/api/article/?page=2&size=1

    这种最为常见,看第N页,每页显示M条数据

    首先也是定义分页类

    from rest_framework.pagination import PageNumberPagination
    
    
    class MyPageNumber(PageNumberPagination):
        page_size = 8  # 每页显示多少条
        page_size_query_param = 'size'  # URL中每页显示条数的参数
        page_query_param = 'page'  # URL中页码的参数
        max_page_size = 8  # 最大页码数限制

    视图1、对于APIView进行的封装

    class ArticleList(APIView):
        def get(self, request, *args, **kwargs):
            res = {"code": 1000}
            article_list = models.Article.objects.all().order_by("id")
            # 分页
            page_obj = MyPageNumber()
            page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self)
            ser_obj = ArticleSerializer(page_article, many=True)    # 注意这里的传参已经变了
            res["data"] = ser_obj.data
            return Response(res)

    视图2、对于ViewSet进行封装的视图

    class PublishesViewSet(viewsets.ModelViewSet):
        queryset = Publish.objects.all()
        serializer_class = PublishModelSerializer
        pagination_class = MyPageNumber    # 就是加上这句代码

    也可一加在全局

    page_size = 8  # 每页显示多少条
    page_size_query_param = 'size'  # URL中每页显示条数的参数
    page_query_param = 'page'  # URL中页码的参数
    max_page_size = 8  # 最大页码数限制
    
    # 照着上面的写
    REST_FRAMEWORK = {
        'PAGE_SIZE': 2
    }

    2、LimitOffsetPagination

    
    

    例如:http://127.0.0.1:8000/api/article/?offset=2&limit=2

    这种见的不多在第N个位置往后偏移查看第M条数据

    分页类

    # offset分页
    class MyLimitOffset(LimitOffsetPagination):
        default_limit = 8
        limit_query_param = 'limit'
        offset_query_param = 'offset'
        max_limit = 8

    视图1、APIview

    class ArticleList(APIView):
        def get(self, request, *args, **kwargs):
            res = {"code": 0}
            article_list = models.Article.objects.all().order_by("id")
            # 分页
            page_obj = MyLimitOffset()
            page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self)
            ser_obj = ArticleSerializer(page_article, many=True)
            res["data"] = ser_obj.data
            return page_obj.get_paginated_response(res)

    视图2、Viewset

    class PublishesViewSet(viewsets.ModelViewSet):
        queryset = Publish.objects.all()
        serializer_class = PublishModelSerializer
        pagination_class = MyLimitOffset    # 就是加上这句代码

    代码一样

    全局配置的参数当然也要改一下

        default_limit = 8
        limit_query_param = 'limit'
        offset_query_param = 'offset'
        max_limit = 8
        
        # 照着上面的写
        REST_FRAMEWORK = {
            'default_limit': 8
            ...
    }

    分页也就到此结束了!可以同Django原生的分页做个对比。

  • 相关阅读:
    互联网流媒体直播点播平台报ioutil.WriteFile错误导致文件只读如何处理?
    互联网直播点播平台go语言搭建重定向和反向代理的区别及使用
    互联网视频直播点播平台EasyDSS如何集成流媒体平台调取登录及上传接口?
    互联网直播点播平台如何联合RTMP推流摄像头构建智慧消防方案?
    RTMP推流网关如何实现摄像头微信幼儿园直播?
    国标GB28181流媒体服务器gorm框架内表明重复添加前缀排查
    国标GB28181流媒体平台EasyGBS新版界面视频流更新时间显示错误问题解决
    视频流媒体播放器EasyPlayer-RTSP-Android 如何随意切换播放视频流?
    国标GB28181流媒体服务器分辨率会导致视频无法播放吗?
    国标GB28181流媒体平台集成后播放多个视频部分视频无法播放问题
  • 原文地址:https://www.cnblogs.com/pontoon/p/10217431.html
Copyright © 2011-2022 走看看