Django rest framework(7)----分頁

Djiango rest  framework  分頁

rest framework 爲咱們提供了3種分頁:  1 PageNumberPagination  2  LimitOffsetPagination  3  CursorPaginationpython

第一種分頁  PageNumberPagination  

這是一種咱們比較常見的分頁,就是顯示第幾頁,一頁顯示多少條數據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  

主要是經過繼承 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)

測試結果以下對象

第二種分頁   LimitOffsetPagination

 這是一種能夠作到從什麼位置開始向後取多少數量的分頁

自定義

在這裏我定義的是每頁顯示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方法  自帶上一頁下一頁

只須要返回的時候使用分頁自帶的  get_paginated_response 便可

 

測試的結果以下

第三種分頁 CursorPagination

這是一種對頁數加密的分頁,主要是用來解決數據量比較大的時候,越日後查看頁數,數據量掃描的數量就比較大,查詢的速度也就比較大,主要的特色是限制頁面大幅度跳轉的狀況好比一開始是第一頁經過用戶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)

 

 

相關文章
相關標籤/搜索