分頁模式
rest framework中提供了三種分頁模式:
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
全局配置
REST_FRAMEWORK = {'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination','PAGE_SIZE': 100
}
局部配置
我們可以在視圖類中進行局部設置
class PublisherViewSet(ModelViewSet):queryset = models.Publisher.objects.all()serializer_class = PublisherModelSerializerpagination_class = PageNumberPagination # 注意不是列表(只能有一個分頁模式)
DRF內置分頁器
1、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 # 最大頁碼數限制# 如果我要的數據是第一頁顯示10條: http://127.0.0.1:8000/books/?size=10&page=1
# 如果我要的是第二頁顯示5條: http://127.0.0.1:8000/books/?size=5&page=2
# max_page_size = 8 :控制最大顯示多少條如果我想第一頁顯示10000條,這種不合理,通過這個參數控制,最大顯示8條
視圖
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.datareturn 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.datareturn page_obj.get_paginated_response(res)
2、LimitOffsetPagination
分頁,在n位置,向后查看m條數據,例如:http://127.0.0.1:8000/api/article/?offset=2&limit=2
分頁器
# offset分頁
class MyLimitOffset(LimitOffsetPagination):default_limit = 5 # 默認偏移的條數 5limit_query_param = 'limit' # 偏移的條數offset_query_param = 'offset' # 從哪開始偏移max_limit = 999 # 偏移的最大條數-http://127.0.0.1:8000/books/ 結果是:從1到5
-http://127.0.0.1:8000/books/?limit=7 結果是:從1到7
-http://127.0.0.1:8000/books/?limit=2&offset=6 結果是:從7到8,兩條
-http://127.0.0.1:8000/books/?offset=6 結果是:從7到11,5條
視圖
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.datareturn page_obj.get_paginated_response(res)
3、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)
?