- ############### 分页组件 ###############
- # 分页组件
- #
- # django 也有分页, REST framework 也有分页, 但是没有页面这个概念了,
- # 这个分页是返回给前端数据太多的时候, 需要分页返回,
- # http://127.0.0.1:8000/books/?page=1,
- # 我们需要把继承这个分页类, 然后重写一些方法,
- # class MyPageNumberPagination(PageNumberPagination):
- # page_size =2
- # page_query_param = "page"
- # page_size_query_param = "size"
- # #####################################
- # http://127.0.0.1:8000/books/?page=1&size=1
- # 默认显示两个, 但是可以自己指定显示几个,
- # #########################################
- # http://127.0.0.1:8000/books/?limit=3
- # http://127.0.0.1:8000/books/?limit=3&offset=1, 这是偏移,
- # #############################################
- # pagination_class = MyPageNumberPagination
- # 这视图里面加上这一句, 就会去找我们定义的视图类了,
- # 所以分页器的使用, 就是定义一个分页的类, 然后加一句, 就可以了,
- ############### 第一种分页器: PageNumberPagination ###############
按页码数分页, 第 n 页, 每页显示 m 条数据
例如: http://127.0.0.1:8000/api/article/?page=2&size=1
分页器:
- class MyPageNumber(PageNumberPagination):
- page_size = 2 # 每页显示多少条
- page_size_query_param = 'size' # URL 中每页显示条数的参数
- page_query_param = 'page' # URL 中页码的参数
- max_page_size = None # 最大页码数限制
视图:
- class ArticleList(APIView):
- def get(self, request, *args, **kwargs):
- res = {"code": 0}
- 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)
返回带页码链接的响应:
- class ArticleList(APIView):
- def get(self, request, *args, **kwargs):
- res = {"code": 0}
- 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 page_obj.get_paginated_response(res)
- ############### 第二种分页器: LimitOffsetPagination ###############
分页, 在 n 位置, 向后查看 m 条数据
例如: http://127.0.0.1:8000/api/article/?offset=2&limit=2
分页器:
- # offset 分页
- class MyLimitOffset(LimitOffsetPagination):
- default_limit = 1
- limit_query_param = 'limit'
- offset_query_param = 'offset'
- max_limit = 999
视图:
- 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)
- ############### 第三种分页器: CursorPagination ###############
加密分页, 把上一页和下一页的 id 值记住
分页器:
- # 加密分页
- class MyCursorPagination(CursorPagination):
- cursor_query_param = 'cursor'
- page_size = 1
- ordering = '-id' # 重写要排序的字段
视图:
- class ArticleList(APIView):
- def get(self, request, *args, **kwargs):
- res = {"code": 0}
- article_list = models.Article.objects.all().order_by("id")
- # 分页
- page_obj = MyCursorPagination()
- 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)
- return page_obj.get_paginated_response(res)
- ############### 分页组件 ###############
来源: http://www.bubuko.com/infodetail-3415657.html