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)