1. 程式人生 > 實用技巧 >drf-分頁

drf-分頁

目錄

一、三種分頁模式

1 PageNumberPagination

from  rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination

class Mypagination(PageNumberPagination):
    page_size = 3  # 每頁條數
    page_query_param = 'aaa'  # 查詢第幾頁的key
    page_size_query_param = 'size'
    # 每一頁顯示的條數,可以在url後面拼接size=4,修改每頁展示條數,但是這個條數不能超過最大展示數
    max_page_size = 5 # 每頁最大展示數

class BookTest(ListAPIView):
    queryset = models.Book.objects.all()
    serializer_class = sers.Bookserializers
    pagination_class = Mypagination
    
# http://127.0.0.1:8000/api/books/?aaa=2&size=6

2 LimitOffsetPagination

class Mypagination(LimitOffsetPagination):
    default_limit = 3   # 每頁條數
    limit_query_param = 'limit' # 往後拿幾條的key
    offset_query_param = 'offset' # 標杆的key
    max_limit = 5   # 每頁最大幾條
# http://127.0.0.1:8000/api/books/?limit=3&offset=3

3 CursorPagination

class Mypagination(CursorPagination):
    cursor_query_param = 'cursor'  # 每一頁查詢的key
    page_size = 2  # 每頁顯示的條數
    ordering = '-id'  # 排序欄位
# http://127.0.0.1:8000/api/books/?cursor=cj0xJnA9NQ%3D%3D

總結:在分頁的時候我們通常是在查詢全部的時候才需要分頁,所以檢視類必須繼承ListAPIView或者繼承規則與其相同也行。三種分頁方式各有各的好處,第一種分頁和第二種分頁都是會把資料整體都拿出來,比較佔資源,但是可以指定快速找到要找的資料。第三種分頁方式就只能往前和往後,讀取資料雖然很快,但是找到具體的資料就很慢

二、繼承APIView的檢視類下寫分頁

# 如果使用APIView分頁
from utils.throttling import MyThrottle
class BookView(APIView):
    # throttle_classes = [MyThrottle,]
    def get(self,request,*args,**kwargs):
        book_list=models.Book.objects.all()
        # 例項化得到一個分頁器物件
        page_cursor=MyPageNumberPagination()

        book_list=page_cursor.paginate_queryset(book_list,request,view=self)
        next_url =page_cursor.get_next_link()
        pr_url=page_cursor.get_previous_link()
        # print(next_url)
        # print(pr_url)
        book_ser=BookModelSerializer(book_list,many=True)
        return Response(data=book_ser.data)