分頁, 解析器, 渲染器
阿新 • • 發佈:2019-01-14
1,分頁:分頁DRF提供三種 分頁方式:
- /////?page=1&size=5分頁
- 限制的那種limit/offset分頁
- 油表分頁,預設有上一頁和下一頁
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,解析器:
- 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測試頁面,就是通過瀏覽器的渲染器來做到的