drf之分页组件

249 阅读1分钟

1.PageNumberPagination

1.1 概述

PageNumberPagination适用于显示页面、上一页、下一页,url示例:/accounts/?page=7&page_size=2

1.2 应用示例代码

1.2.1 settings

REST_FRAMEWORK = {
    "UNAUTHENTICATED_USER": None,
    "PAGE_SIZE": 2    # 配置分页后每页的数据数量
}

1.2.2 视图view

class BlogView(APIView):
    def get(self, request, *args, **kwargs):
        """ 博客列表 """
        # 1.读取数据库中的博客信息
        queryset = models.Blog.objects.all().order_by("id")

        # 2.分页处理得到分页后的->queryset
        from rest_framework.pagination import PageNumberPagination
        pager = PageNumberPagination()
        result = pager.paginate_queryset(queryset, request, self)    # 源码

        # 3.序列化
        ser = BlogSerializers(instance=result, many=True)

        # 4.获取序列化结果 or 分页返回处理
        response = pager.get_paginated_response(ser.data)   # 源码
        return response

2.LimitOffsetPagination

2.1 概述

  • LimitOffsetPagination适用于滚动翻页,url示例:/accounts/?offset=10&limit=10
  • 注意:limitOffset的形式一般会结合上一次的商品ID,查询小于此ID的商品,实现 滚动下来分析。

2.2 应用示例代码

class BlogView(APIView):   

    def get(self, request, *args, **kwargs):
        """ 博客列表 """

        # 1.读取数据库中的博客信息
        queryset = models.Blog.objects.all().order_by("-id")

        # ?max_id=1
        # ?min_id=13
        max_id = request.query_params.get("max_id")
        if max_id:
            queryset = queryset.filter(id__lt=max_id)

        # 2.分页处理得到分页后的->queryset
        from rest_framework.pagination import LimitOffsetPagination

        pager = LimitOffsetPagination()
        result = pager.paginate_queryset(queryset, request, self)

        # 3.序列化
        ser = BlogSerializers(instance=result, many=True)

        # 4.获取序列化结果 or 分页返回处理
        response = pager.get_paginated_response(ser.data)
        return response