1. 程式人生 > 實用技巧 >django_restfreamwork 7 分頁元件

django_restfreamwork 7 分頁元件

DRF【分頁元件】

DRF分頁器和作用

作用:

對千萬條資料查詢,全部取出來,對記憶體要求很高,甚至有可能會暴記憶體,對機器記憶體壓力非常大

如果資料一點點取,專案也分頁展示,就可以對專案進行負載的優化

DRF框架提供了3種分頁

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination

3種分頁的區別

PageNumberPagination : 使用page 和page_size做分頁 ,拿第幾頁,每頁顯示多少個

LimitOffsetPagination

:從第幾個開始找,向後找多少條

CursorPagination:基於遊標的分頁,對url引數進行加密,並且可以對某些欄位進行正序和倒序

PageNumberPagination分頁元件

新建分頁元件

新建pagination.py 或者 utils/pagination.py 也可以

from rest_framework.pagination import PageNumberPagination
class MyPagination(PageNumberPagination):
    """
        http://xxx.xx.xx/?page=4
        或者
        http://xxx.xx.xx/?page=4&page_size=100
    """
    page_size = 2       #每頁幾條資料
    page_query_param = "page"
    page_size_query_param = "size"
    max_page_size = 3

檢視介面呼叫分頁元件

from .models import Book
from rest_framework.views import APIView
from rest_framework.response import Response
from .serializers import BookSerializer
from .pagination import MyPagination    #匯入分頁器
class BookView(APIView):
    def get(self, request):
        """ """
        book_list = Book.objects.all()
        # 1,例項化分頁物件
        page_obj = MyPagination()
        # 2,呼叫分頁方法去分頁queryset
        page_queryset = page_obj.paginate_queryset(queryset=book_list,request=request,view=self)
        """ 引數1傳queryset,引數2傳request,引數3傳self也可以等於None """
        # 3,把分頁好的資料 傳給序列化器 返回
        ser_obj = BookSerializer(page_queryset, many=True)
        # 4,帶著上一頁下一頁連結 響應
        return page_obj.get_paginated_response(ser_obj.data)

子路由

from django.urls import path, include
from .views import BookView

urlpatterns = [
    path('list', BookView.as_view()),
]

測試訪問介面

預設 訪問 是 0.0.0.0:8000/books/list

指定size訪問: 0.0.0.0:8000/books/list?page=2&size=2

第2頁,展示2條資料

如果url不指定 size ,那麼就會從分頁器元件中去找 page_size的值 預設配置的2

LimitOffsetPagination分頁元件

新建分頁元件

新建pagination.py 或者 utils/pagination.py 也可以

from rest_framework.pagination import LimitOffsetPagination
class MyPagination(LimitOffsetPagination):

    default_limit = 1           #預設向後找幾條資料
    limit_query_param = "limit" #自定義名
    offset_query_param = "offset"
    max_limit = 3               #最大限制

應用分頁元件&子路由 同上

和 PageNumberPagination 元件使用的呼叫一模一樣,無需改動程式碼

測試訪問介面

0.0.0.0:8000/books/list?limit=2&offset=1

limit=2 :向後找2條 offset=1 從第一條開始找

CursorPagination 分頁元件

新建分頁元件

新建pagination.py 或者 utils/pagination.py 也可以

from rest_framework.pagination import CursorPagination
class MyPagination(CursorPagination):

    cursor_query_param = "cursor"
    page_size = 2       #每頁顯示幾條
    ordering = "-id"    #根據xx進行排序 -為倒序:從大到小

應用分頁元件&子路由 同上

和 PageNumberPagination 元件使用的呼叫一模一樣,無需改動程式碼

測試訪問介面

預設訪問 0.0.0.0:8000/books/list 介面

根據id從大到小返回資料 , 並且上一頁引數和下一頁引數進行加密

總結

之前是檢視繼承了 APIView ,所以對get請求進行了改動

如果檢視類繼承了 GenericAPIView ListModelMixin

只需要在 pagination_class = MyPagination 匯入分頁元件,就能自動根據分頁配置進行展示

from .models import Book
from .serializers import BookSerializer
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin
class BookView(GenericAPIView,ListModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    pagination_class = MyPagination         #直接引用分頁元件,下面的get方法展示資料自動根據分頁展示

    def get(self, request):
        return self.list(request)