drf分頁元件(5星)
阿新 • • 發佈:2022-04-12
目錄
分頁Pagination(5星)
當我們的資料比較多的時候,就需要用到分頁,一般在查詢所有的介面中,才有分頁功能,很常用,就是網站的下一頁功能,app的下滑載入更多。
REST framework提供了分頁的支援。配置分頁類,繼承GenericAPIView及子類,才能使用
PageNumberPagination 基本分頁
**用的最多 **
重要類屬性
page_size = api_settings.PAGE_SIZE # 每頁顯示條數
page_query_param = 'page' # 查詢使用的引數http:.../?page=2 改的是page
page_size_query_param = 'size' # http:.../?page=1&size=4 size是更改一次返回的條數
max_page_size = 10 # 一頁最多顯示10條(優先順序最高)
使用方法
新建一個py檔案
from rest_framework.pagination import PageNumberPagination class CommonPagination(PageNumberPagination): # 繼承上面的類然後重寫引數 page_size = 3 # 每頁顯示條數 page_query_param = 'page' # 查詢使用的引數http:.../?page=2 改的是page page_size_query_param = 'site' # http:.../?page=1&size=4 size是更改一次展示的條數(類似limit) max_page_size = 5 # 每頁最多顯示多少條,?page=3&size=9,最終還是顯示5條 # 當在url裡輸入page=last時,就會跳到最後一頁
在檢視類裡:
from app01.pagination import CommonPagination # 把分頁類匯入
class BookAPIView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookModelSerializer
pagination_class = CommonPagination # 使用分頁類
#####配置分頁類,繼承GenericAPIView及子類,才能使用#####
分頁與過濾連用
from rest_framework.filters import SearchFilter, OrderingFilter from .untils import BookFilter, MyPageNumber class BookAPIView(GenericViewSet, ListModelMixin): queryset = Book.objects.all() serializer_class = BookModelSerializer filter_backends = [SearchFilter, OrderingFilter] search_fields = ['title', 'price'] ordering_fields = ['price', 'id'] pagination_class = MyPageNumber
LimitOffsetPagination 偏移分頁
重要類屬性
default_limit = api_settings.PAGE_SIZE # 顯示多少條
limit_query_param = 'limit' # 查詢使用的引數http:.../limit=2&offset=4 改的是limit
offset_query_param = 'offset' # offset偏移的查詢引數 改的是offset,比如改成'o'
max_limit = 5 # 最大顯示條數,為5
使用方法
新建一個py檔案
from rest_framework.pagination import LimitOffsetPagination
class CommonLimitOffset(LimitOffsetPagination):
default_limit = 3 # 顯示多少條
limit_query_param = 'limit' # 查詢使用的引數http:.../limit=2&offset=4 改的是limit
offset_query_param = 'offset' # offset偏移的查詢引數 改的是offset,比如改成'o'
max_limit = 5 # 最大顯示條數,為5
在檢視類裡:
from app01.pagination import CommonLimitOffset # 把分頁類匯入
class BookAPIView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookModelSerializer
pagination_class = CommonLimitOffset # 使用分頁類
#####配置分頁類,繼承GenericAPIView及子類,才能使用#####
CursorPagination遊標分頁
只用後不能用其他的排序 不然報錯
重要類屬性
ordering = 'id' # 排序,按id排序 一定要有排序
cursor_query_param = 'cursor' # 查詢引數 改的是cursor,比如改成'c'
page_size = 3 # 每頁顯示多少條
page_size_query_param = 'size' # 通過這個引數決定每頁顯示多少條
max_page_size = 5 # 每頁最大顯示多少條
使用方法
新建一個py檔案
from rest_framework.pagination import CursorPagination
class CommonCursorPagination(CursorPagination):
cursor_query_param = 'cursor' # 查詢條件
page_size = 3 # 每頁顯示多少條
ordering = 'id' # 排序,按id排序
page_size_query_param = 'size' # 通過這個引數決定每頁顯示多少條
max_page_size = 5 # 每頁最大顯示多少條
在檢視類裡:
from app01.pagination import CommonCursorPagination
class BookAPIView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookModelSerializer
pagination_class = CommonCursorPagination
#####配置分頁類,繼承GenericAPIView及子類,才能使用#####
總結
# Cursor分頁和上面兩種的區別:上面兩種,可以從中間位置獲取某一頁,Cursor的方式只能上一頁和下一頁
# PageNumber和LimitOffset這兩種在獲取某一頁的時候,都需要從開始過濾到要取的頁面數的資料
# 而Cursor分頁是先排序,內部維護了一個遊標,遊標只能選擇往前或往後走,在取某一頁的時候,不許喲啊過濾之前的資料
Cursor分頁:
## 優點:速度最快,資料量越大,越有優勢(抖音下劃分頁,不需要指定跳轉到第幾頁)
## 缺點:只能前一頁和後一頁,不能直接跳到某一頁
繼承APIView實現分頁
以PageNumberPagination 基本分頁為例(剩下兩種都是一樣的操作)
使用方法
在新的py檔案內書寫分頁類
from rest_framework.pagination import PageNumberPagination
class CommonPagination(PageNumberPagination):
page_size = 3 # 每頁顯示條數
page_query_param = 'page' # 查詢時用的引數http:.../?page=2 改的是page
page_size_query_param = 'site' # http:.../?page=1&size=4 size是更改一次返回的條數
max_page_size = 10 # 一頁最多顯示10條(優先順序最高)
在檢視類裡:
class BookViewALL(APIView):
throttle_classes = []
authentication_classes = []
permission_classes = []
def get(self,request,*args,**kwargs):
book_list=Books.objects.all()
#例項化得到一個物件
pagination=CommonPageNumberPagination()
#呼叫物件方法,傳入要分頁的資料,book_list,返回分頁號的資料
new_book_list=pagination.paginate_queryset(book_list,request,self)
# 序列化分頁後的資料
ser=BookSerializer(instance=new_book_list,many=True)
# 返回方式
return pagination.get_paginated_response(ser.data)