1. 程式人生 > 其它 >drf分頁元件(5星)

drf分頁元件(5星)

目錄

分頁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)