rest-framework分页

一、使用rest-framework返回json数据格式

  • 1、导包

    from rest_framework.response import Response
    
  • 2、直接使用序列化后的数据返回

    from rest_framework.response import Response
    
    class RoleSerializer3(serializers.ModelSerializer):
        class Meta(object):
            model = models.RoleModel
            fields = '__all__'
    
    class RoleView3(APIView):
    
        def get(self, request, *args, **kwargs):
            roles = models.RoleModel.objects.all()
    
            ser = RoleSerializer3(instance=roles, many=True)
            return Response(ser.data)
    

二、使用内置分页插件

  • 1、导包

    from rest_framework.pagination import PageNumberPagination
    
  • 2、在settings.py中配置一页显示多少条数据

    REST_FRAMEWORK = {
        'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser'],
        'PAGE_SIZE': 2,  # 表示一页显示2条数据
    }
    
  • 3、在视图类中使用

    from rest_framework.pagination import PageNumberPagination
    
    class RoleSerializer3(serializers.ModelSerializer):
        class Meta(object):
            model = models.RoleModel
            fields = '__all__'
    
    class RoleView3(APIView):
    
        def get(self, request, *args, **kwargs):
            # 获取全部的数据
            roles = models.RoleModel.objects.all()
            # 创建一个分页对象
            pg = PageNumberPagination()
            # 在数据库中获取分页的数据
            pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
            # 序列化
            ser = RoleSerializer3(instance=pager_roles, many=True)
            return Response(ser.data)
    
  • 4、我们请求的url地址

    # 如果是第一页可以是
    http://127.0.0.1:9000/app01/api/v1/role3/
    http://127.0.0.1:9000/app01/api/v1/role3/?page=2
    

三、自定义分页类(继承PageNumberPagination类)

  • 1、自定义分页类

    class MyPageNumberPagination(PageNumberPagination):
        page_size = 3
        page_size_query_param = 'size'  # 一页多少条数据
        max_page_size = 5
        page_query_param = 'page' # 显示第几页
    
  • 2、在视图中使用

    class RoleView3(APIView):
    
        def get(self, request, *args, **kwargs):
            # 获取全部的数据
            roles = models.RoleModel.objects.all()
            # 创建一个分页对象
            pg = MyPageNumberPagination()
            # 在数据库中获取分页的数据
            pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
            # 序列化
            ser = RoleSerializer3(instance=pager_roles, many=True)
            return Response(ser.data)
    

四、使用limitOffsetPagination进行分页

  • 1、导包

    from rest_framework.pagination import LimitOffsetPagination
    
  • 2、自定义类

    class MyPageNumberPagination(LimitOffsetPagination):
        default_limit = 3 # 默认取3条数据
        limit_query_param = 'limit' # 可以自定义显示多少条 xxx?limit=4&offset=1
        offset_query_param = 'offset' # 偏移多少
        max_limit = 5
    
  • 3、视图类中使用

    class RoleView3(APIView):
    
        def get(self, request, *args, **kwargs):
            # 获取全部的数据
            roles = models.RoleModel.objects.all()
            # 创建一个分页对象
            pg = MyPageNumberPagination()
            # 在数据库中获取分页的数据
            pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
            # 序列化
            ser = RoleSerializer3(instance=pager_roles, many=True)
            return Response(ser.data)
    
  • 4、url地址http://127.0.0.1:9000/app01/api/v1/role3/?offset=4&limit=3

五、显示上一页下一页

  • 1、只要在视图类中使用

    class RoleView3(APIView):
    
        def get(self, request, *args, **kwargs):
            # 获取全部的数据
            roles = models.RoleModel.objects.all()
            # 创建一个分页对象
            pg = MyPageNumberPagination()
            # 在数据库中获取分页的数据
            pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
            # 序列化
            ser = RoleSerializer3(instance=pager_roles, many=True)
            # return Response(ser.data)
            # 使用分页插件里面的会显示上一页下一页
            return pg.get_paginated_response(ser.data)
    

六、加密分页(上一页下一页没规律)

  • 1、导包

    from rest_framework.pagination import CursorPagination
    
  • 2、自定义类继承

    class MyPageNumberPagination(CursorPagination):
        cursor_query_param = 'cursor'
        page_size = 2
        ordering = 'id'
        page_size_query_param = None
        max_page_size = None
    

七、全局配置

  • 1、全局配置

    REST_FRAMEWORK = {
        'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser'],
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
        'PAGE_SIZE': 4
    }
    
  • 2、在视图中直接使用

    class RoleView3(APIView):
    
        def get(self, request, *args, **kwargs):
            # 获取全部的数据
            roles = models.RoleModel.objects.all()
            # 创建一个分页对象
            pg = LimitOffsetPagination()
            # 在数据库中获取分页的数据
            pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
            # 序列化
            ser = RoleSerializer3(instance=pager_roles, many=True)
            # return Response(ser.data)
            return pg.get_paginated_response(ser.data)
    

八、总结

情景一、如果仅仅是想使用分页(默认分页与配置就可以)

  • 1、在settings.py中配置

    REST_FRAMEWORK = {
        'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser'],
        'PAGE_SIZE': 10, # 一页显示多少条数据
    }
    
  • 2、在视图类中定义使用

    from rest_framework.pagination import PageNumberPagination
    
    class GoodsCategoryView(ListModelMixin, GenericViewSet):
        """
        配置商品分类的视图
        """
        queryset = models.GoodsCategoryModel.objects.all()
        serializer_class = serializers.GoodsCategorySerializer
        # 配置分页的类
        pagination_class = PageNumberPagination
    

情景二、需要自己配置点参数(重写类)

  • 1、继承PageNumberPagination

    class Page(PageNumberPagination):
        page_size = 10
        # 表示从多少页开始
        page_size_query_param = 'size'
        page_query_param = 'p'
        max_page_size = 100
    
  • 2、使用自定义的类

    class GoodsCategoryView(ListModelMixin, GenericViewSet):
        """
        配置商品分类的视图
        """
        queryset = models.GoodsCategoryModel.objects.all()
        serializer_class = serializers.GoodsCategorySerializer
        pagination_class = Page
    

results matching ""

    No results matching ""