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原生的分页做个对比。

  • 相关阅读:
    js的继承实现方式
    jdbc调用通用存储过程完成分页
    最近在忙些什么......
    【转】说服下属的“攻心术”
    设计模式原则详解
    【转】职场学做“功夫熊猫”
    内核初始化优化宏 ,初始化顺序, __init,__devexit等
    Linux 嵌入式启动以及优化
    每个程序员都该知道的10大编程格言
    linux 用户空间 和 内核空间 延时函数
  • 原文地址:https://www.cnblogs.com/pontoon/p/10217431.html
Copyright © 2011-2022 走看看