rest framework 爲咱們提供了3種分頁: 1 PageNumberPagination 2 LimitOffsetPagination 3 CursorPaginationpython
這是一種咱們比較常見的分頁,就是顯示第幾頁,一頁顯示多少條數據api
咱們能夠在配置中指定每頁顯示多少條數據,還有在url 中指定參數page = 能夠顯示多少頁函數
序列化表 api/utils/serializers/pager.py 測試
from rest_framework import serializers from api import models class PagerSerialiser(serializers.ModelSerializer): class Meta: model = models.Role fields = "__all__"
分頁的類視圖函數代碼加密
from api.utils.serializsers.pager import PagerSerialiser from rest_framework.response import Response from rest_framework.pagination import PageNumberPagination class Pager1View(APIView): def get(self,request,*args,**kwargs): #獲取全部數據 roles = models.Role.objects.all() #建立分頁對象 pg = PageNumberPagination() #獲取分頁的數據 page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self) #對數據進行序列化 ser = PagerSerialiser(instance=page_roles,many=True) return Response(ser.data)
settings配置每頁顯示多少條數據url
REST_FRAMEWORK = { #分頁 "PAGE_SIZE":2 #每頁顯示多少個 }
添加路由spa
urlpatterns = [ url('(?P<version>[v1|v2]+)/page1/', Pager1View.as_view(),) #分頁1 ]
在這裏我經過url中的參數page 我指定顯示第二頁的數據rest
主要是經過繼承 PageNumberPagination 改變其內部顯示的每頁最大值 默認每頁顯示的數量 每頁顯示多少個code
#自定義分頁類 class MyPageNumberPagination(PageNumberPagination): #每頁顯示多少個 page_size = 3 #默認每頁顯示3個,能夠經過傳入pager1/?page=2&size=4,改變默認每頁顯示的個數 page_size_query_param = "size" #最大頁數不超過10 max_page_size = 10 #獲取頁碼數的 page_query_param = "page" class Pager1View(APIView): def get(self,request,*args,**kwargs): #獲取全部數據 roles = models.Role.objects.all() #建立分頁對象,這裏是自定義的MyPageNumberPagination pg = MyPageNumberPagination() #獲取分頁的數據 page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self) #對數據進行序列化 ser = PagerSerialiser(instance=page_roles,many=True) return Response(ser.data)
測試結果以下對象
這是一種能夠作到從什麼位置開始向後取多少數量的分頁
在這裏我定義的是每頁顯示2條數據,每頁最多顯示的個數是10個
#自定義分頁類2 class MyLimitOffsetPagination(LimitOffsetPagination): #默認顯示的個數 default_limit = 2 #當前的位置 offset_query_param = "offset" #經過limit改變默認顯示的個數 limit_query_param = "limit" #一頁最多顯示的個數 max_limit = 10 class Pager1View(APIView): def get(self,request,*args,**kwargs): #獲取全部數據 roles = models.Role.objects.all() #建立分頁對象 pg = MyLimitOffsetPagination() #獲取分頁的數據 page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self) #對數據進行序列化 ser = PagerSerialiser(instance=page_roles,many=True) return Response(ser.data)
測試結果以下:
我想要顯示第3個後面的1條數據
http://127.0.0.1:8000/api/v1/pager1/?offset=3&limit=1
只須要返回的時候使用分頁自帶的 get_paginated_response 便可
測試的結果以下
這是一種對頁數加密的分頁,主要是用來解決數據量比較大的時候,越日後查看頁數,數據量掃描的數量就比較大,查詢的速度也就比較大,主要的特色是限制頁面大幅度跳轉的狀況好比一開始是第一頁經過用戶url 直接翻到100頁,在這裏對頁數進行了加密,在這裏它的內部爲了加快查詢記錄了id的最大值和最小值
加密分頁方式,只能經過點「上一頁」和下一頁訪問數據
#自定義分頁類3 (加密分頁) class MyCursorPagination(CursorPagination): cursor_query_param = "cursor" page_size = 2 #每頁顯示2個數據 ordering = 'id' #排序 page_size_query_param = None max_page_size = None class Pager1View(APIView): def get(self,request,*args,**kwargs): #獲取全部數據 roles = models.Role.objects.all() #建立分頁對象 pg = MyCursorPagination() #獲取分頁的數據 page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self) #對數據進行序列化 ser = PagerSerialiser(instance=page_roles,many=True) # return Response(ser.data) return pg.get_paginated_response(ser.data)