一 簡單分頁(查看第n頁,每頁顯示n條)
from rest_framework.pagination import PageNumberPagination # 一 基本使用:url=url=http://127.0.0.1:8000/pager/?page=2&size=3,size無效 class Pager(APIView): def get(self,request,*args,**kwargs): # 獲取所有數據 ret=models.Book.objects.all() # 創建分頁對象 page=PageNumberPagination() # 在數據庫中獲取分頁的數據 page_list=page.paginate_queryset(ret,request,view=self) # 對分頁進行序列化 ser=BookSerializer1(instance=page_list,many=True) return Response(ser.data) # 二 自定制 url=http://127.0.0.1:8000/pager/?page=2&size=3 # size=30,無效,最多5條 class Mypage(PageNumberPagination): page_size = 2 page_query_param = 'page' # 定制傳參 page_size_query_param = 'size' # 最大一頁的數據 max_page_size = 5 class Pager(APIView): def get(self,request,*args,**kwargs): # 獲取所有數據 ret=models.Book.objects.all() # 創建分頁對象 page=Mypage() # 在數據庫中獲取分頁的數據 page_list=page.paginate_queryset(ret,request,view=self) # 對分頁進行序列化 ser=BookSerializer1(instance=page_list,many=True) # return Response(ser.data) # 這個也是返回Response對象,但是比基本的多了上一頁,下一頁,和總數據條數(了解即可) return page.get_paginated_response(ser.data)
setting里
REST_FRAMEWORK = { # 每頁顯示兩條 'PAGE_SIZE':2 }
路由:
url(r'^pager/$', views.Pager.as_view()),
Serializers
class BookSerializer1(serializers.ModelSerializer): class Meta: model=models.Book # fields="__all__" exclude=('authors',)
二 偏移分頁(在第n個位置,向后查看n條數據)
# http://127.0.0.1:8000/pager/?offset=4&limit=3 from rest_framework.pagination import LimitOffsetPagination # 也可以自定制,同簡單分頁 class Pager(APIView): def get(self,request,*args,**kwargs): # 獲取所有數據 ret=models.Book.objects.all() # 創建分頁對象 page=LimitOffsetPagination() # 在數據庫中獲取分頁的數據 page_list=page.paginate_queryset(ret,request,view=self) # 對分頁進行序列化 ser=BookSerializer1(instance=page_list,many=True) # return page.get_paginated_response(ser.data) return Response(ser.data)
三 CursorPagination(加密分頁,只能看上一頁和下一頁,速度快)
思考:不重寫類,修改類屬性?
from rest_framework.pagination import CursorPagination # 看源碼,是通過sql查詢,大於id和小於id class Pager(APIView): def get(self,request,*args,**kwargs): # 獲取所有數據 ret=models.Book.objects.all() # 創建分頁對象 page=CursorPagination() page.ordering='nid' # 在數據庫中獲取分頁的數據 page_list=page.paginate_queryset(ret,request,view=self) # 對分頁進行序列化 ser=BookSerializer1(instance=page_list,many=True) # 可以避免頁碼被猜到 return page.get_paginated_response(ser.data)
