drf-分頁
阿新 • • 發佈:2020-07-13
目錄
一、三種分頁模式
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)