1. 程式人生 > >分頁, 解析器, 渲染器

分頁, 解析器, 渲染器

1,分頁:分頁DRF提供三種 分頁方式:

  1. /////?page=1&size=5分頁
  2. 限制的那種limit/offset分頁
  3. 油表分頁,預設有上一頁和下一頁

2,PageNumberPagination的原始碼如下:

 

 3,LimitOffsetPagination分頁器的原始碼:

 

 4,cursorPaginator油表的原始碼:

 

5,分頁器的程式碼:

 

from rest_framework import pagination


# 第一種是page/size分頁
class MyPaginator(pagination.PageNumberPagination):
    # 設定一頁顯示多少內容
    page_size = 2
    page_query_param = "page"
    page_size_query_param = "size"
    max_page_size = 3


# 第二種是限制的那種方法limit/offset分頁
class LimitOffsetPaginator(pagination.LimitOffsetPagination): # 預設限制的是1 default_limit = 1 # limit查詢的引數一頁顯示的內容是多少 limit_query_param = "limit" # 一條資料顯示多少內容. offset_query_param = "offset" # 遊標分頁,預設有上一頁和下一頁 class CursorPaginator(pagination.CursorPagination): cursor_query_param = "cursor" ordering = "id" page_size = 2

6,三種分頁方法都有一個共同的方法 

7,分頁的view的程式碼:

from utils.pagination import MyPaginator, LimitOffsetPaginator, CursorPaginator


# 寫一個終極版本就三行
class BookModelView(viewsets.ModelViewSet):
    # 獲取使用者匹配的物件
    # 獲取序列化器
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    # 例項化分頁器的物件
    pagination_class = MyPaginator  # 不加括號,原始碼裡邊加了


# 這是page和size分頁的方式
class PageBookView(APIView):
    # 寫一個get方法
    def get(self, request): # 獲取到資料庫中所有的資料 queryset = Book.objects.all() # 例項化分頁器 page_obj = MyPaginator() # 用自己寫好的分頁器進行分頁,在原始碼中會提供paginate_queryset的方法 page_data = page_obj.paginate_queryset(queryset, request) # 將分頁後的資料序列化 ser_obj = BookSerializer(page_data, many=True) # 給相應填加上一頁和下一頁 # 例項化paginator的物件會提供一個get_paginated_response的方法就會有上一頁和下一頁的顯示 return page_obj.get_paginated_response(ser_obj.data) # 這是limit和offset的分頁 class LimitBookView(APIView): # 寫一個get方法 def get(self, request): # 獲取資料庫中的所有資料 queryset = Book.objects.all() # 例項化分頁器的物件,就會有分頁器的所有屬性和方法 page_obj = LimitOffsetPaginator() # 用自己寫好的分頁器進行分頁,在原始碼中會提供paginate_queryset的方法 page_data = page_obj.paginate_queryset(queryset, request) # 將分頁後的資料序列化 ser_obj = BookSerializer(page_data, many=True) # 給相應新增上一頁和下一頁 # 例項化的分頁器的物件會提供一個get_paginated_response的方法會提供上一頁和下一頁 return page_obj.get_paginated_response(ser_obj.data) # 油表的那種分頁,預設有上一頁和下一頁 class CursorBookView(APIView): # 手寫一個get方法 def get(self, request): # 從資料庫中獲取書籍的物件 queryset = Book.objects.all() # 例項化分頁器物件,就會有分頁器的所有屬性和方法 page_obj = CursorPaginator() # 將獲取到的資料進行分頁處理(第一個是要分頁的資料, 第二個是請求request) page_data = page_obj.paginate_queryset(queryset, request) # 將分頁後的資料序列化 ser_obj = BookSerializer(page_data, many=True) # 給相應的加上上一頁和下一頁 # 例項化的分頁器的物件會提供一個get_paginated_response的方法會提供上一頁和下一頁 return page_obj.get_paginated_response(ser_obj.data)

 8,解析器:

  1. Django的解析器:當請求進來的時候,請求體在request.body中,那也就證明,解析器會把解析好的資料放入request,body中,我們在檢視中可以列印request的型別,能夠知道request是WSGIRequest這個類,原始碼分析如下:

from django.core.handlers.wsgi import WSGIRequest

這樣就能實現多種型別的檔案上傳

一個解析到request.POST中,一個解析到request.FILES中,也就是說我們之前能在request中能得到各種資料是因為用了不同的資料解析器

9,DRF的解析器

解析器,顧名思義是將請求提交的資料進行解析,因此解析資料只能存在於request,data提交資料的時候

from rest_framework.negotiation import DefaultContentNegotiation

自己配置檢視的解析器

10,DRF的渲染器

我們在瀏覽器中展示的DRF測試頁面,就是通過瀏覽器的渲染器來做到的