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