9.5 rest framework 分頁,版本
阿新 • • 發佈:2019-02-07
exception .py 版本 判斷 any tof fst 最大 遊標
分頁
分頁器的引入
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
分頁器的創建
PageNumberPagination分頁器
按頁碼數分頁,第n頁,每頁顯示m條數據
使用URL
http://127.0.0.1:8000/api/article/?page=2&size=1
示例
# PageNumberPagination 方式 分頁器 class MyPageNumberPagination(PageNumberPagination): #創建一個自定義類繼承分頁器類,自定義類中進行參數設置,自定義類的實例化即為分頁器對象 page_size = 1 # 每頁顯示數目 page_query_param = ‘page‘ # url 中的指定 關鍵字 page_size_query_param = "size" # 允許臨時添加的參數 max_page_size = 5 # 對臨時添加數據的限制 """ 關於臨時添加參數 http://127.0.0.1:8000/?page=1&size=2 size 為臨時添加數據 由 page_size_query_param 控制 max_page_size 控制 size 的限制"""
class P2(PageNumberPagination): #默認每頁顯示的數據條數 page_size = 2 #獲取url參數中設置的每頁顯示數據條數 page_size_query_param = ‘size‘ #獲取url中傳入的頁碼key page_query_param = ‘page‘ #最大支持的每頁顯示的數據條數 max_page_size = 5 class IndexView3(APIView): #使用http://127.0.0.1:8080/app01/v1/index3/?page=1&page_size=1可進行判斷def get(self,request,*args,**kwargs): user_list = models.UserInfo.objects.all() #實例化分頁對象,獲取數據庫中的分頁數據 p2 = P2() print(p2.page_size_query_description) page_user_list = p2.paginate_queryset(queryset=user_list,request=request,view=self) print(‘打印的是分頁的數據‘,page_user_list) #序列化對象 ser = MySerializes(instance=page_user_list,many=True) #可允許多個 #生成分頁和數據 # return Response(ser.data) #不含上一頁下一頁 return p2.get_paginated_response(ser.data)
LimitOffsetPagination分頁器
分頁,在n位置,向後查看m條數據
使用URL
http://127.0.0.1:8000/api/article/?offset=2&limit=2
示例
# LimitOffsetPagination 方式 分頁器 class MyPageNumberPagination(LimitOffsetPagination): default_limit=1 # 每頁最多顯示多少數目 關鍵詞是 limit """ LimitOffsetPagination 的分頁器 擁有一個 offset 內置 參數 http://127.0.0.1:8000/?limit=1&offset=2 offst 表示向後偏移,偏移塊大小為 limit的長度 當前頁1 limit=1 offset=2 表示向下偏移兩個長度 顯示第三頁內容 """
from rest_framework.views import APIView from rest_framework.response import Response from app01.serializes.myserializes import MySerializes from rest_framework.pagination import LimitOffsetPagination from app01 import models # =========== 可以自己進行自定制分頁,基於limitoffset=================== class P1(LimitOffsetPagination): max_limit = 3 # 最大限制默認是None default_limit =2 # 設置每一頁顯示多少條 limit_query_param = ‘limit‘ # 往後取幾條 offset_query_param = ‘offset‘ # 當前所在的位置 class IndexView2(APIView): #使用http://127.0.0.1:8080/app01/v1/index2/?offset=2&limit=4可進行判斷 def get(self,request,*args,**kwargs): user_list = models.UserInfo.objects.all() p1 = P1()#註冊分頁 page_user_list = p1.paginate_queryset(queryset=user_list,request=request,view=self) print(‘打印的是分頁的數據‘,page_user_list) ser = MySerializes(instance=page_user_list,many=True) #可允許多個 # return Response(ser.data) #不含上一頁下一頁 return p1.get_paginated_response(ser.data) # =======================也可以用下面這種形式=========== class BaseResponse(object): def __init__(self,code=1000,data=None,error=None): self.code = code self.data = data self.error = error class IndexView(views.APIView): ‘‘‘第二種類表示的方式‘‘‘ def get(self,request,*args,**kwargs): ret = BaseResponse() try: user_list = models.UserInfo.objects.all() p1 = P1() page_user_list = p1.paginate_queryset(queryset=user_list,request=request,view=self) ser = IndexSerializer(instance=page_user_list,many=True) ret.data = ser.data ret.next = p1.get_next_link() except Exception as e: ret.code= 1001 ret.error = ‘xxxx錯誤‘ return Response(ret.__dict__)
CursorPagination分頁器
加密分頁,把上一頁和下一頁的id值記住
使用URL
http://127.0.0.1:8000/api/article/?page=2&size=1
示例
基本和 PageNumberPagination 內部字段差不多
class P3(CursorPagination): # URL傳入的遊標參數 cursor_query_param = ‘cursor‘ # 默認每頁顯示的數據條數 page_size = 2 # URL傳入的每頁顯示條數的參數 page_size_query_param = ‘size‘ # 每頁顯示數據最大條數 max_page_size = 3
# 根據ID從大到小排列 ordering = "id" class IndexView4(APIView): #使用http://127.0.0.1:8080/app01/v1/index4/?cursor=cj0xJnA9NA%3D%3D&size=3可進行判斷 def get(self,request,*args,**kwargs): user_list = models.UserInfo.objects.all().order_by(‘-id‘) p3 = P3()#註冊分頁 page_user_list = p3.paginate_queryset(queryset=user_list,request=request,view=self) print(‘打印的是分頁的數據‘,page_user_list) ser = MySerializes(instance=page_user_list,many=True) #可允許多個 # return Response(ser.data) #不含上一頁下一頁 return p3.get_paginated_response(ser.data)
分頁器的使用
# 分頁器的使用一:未封裝起來的時候 class BookViewSet(viewsets.ModelViewSet): queryset = Book.objects.all() serializer_class = BookSerializers def list(self,request,*args,**kwargs): book_list=Book.objects.all() # 調用分頁器類實例化 (根據分頁器類型要做區分) pp=LimitOffsetPagination() # 對分頁器對象賦值使用 實例化自定義分頁類 # 參數 queryset=被分頁的queryset對象,後兩個固定即可 pager_books=pp.MyPageNumberPagination(queryset=book_list,request=request,view=self) bs=BookSerializers(pager_books,many=True) return pp.get_paginated_response(bs.data) # 分頁器的使用二:封裝起來的時候 class AuthorModelView(viewsets.ModelViewSet): queryset = Author.objects.all() serializer_class = AuthorModelSerializers # 序列化組件 pagination_class = MyPageNumberPagination # 分頁組件,分頁器只能使用一個,此處不可以為列表 # 分頁器的使用三: 全局生效,在settings.py 中設置 REST_FRAMEWORK = { ‘DEFAULT_PAGINATION_CLASS‘: ‘rest_framework.pagination.LimitOffsetPagination‘, ‘PAGE_SIZE‘: 100 }
版本
為什麽需要版本控制
API 版本控制允許我們在不同的客戶端之間更改行為(同一個接口的不同版本會返回不同的數據)。 DRF提供了許多不同的版本控制方案。
可能會有一些客戶端因為某些原因不再維護了,但是我們後端的接口還要不斷的更新叠代,這個時候通過版本控制返回不同的內容就是一種不錯的解決方案。
內置版本類型
DRF提供了五種版本控制方案
版本的創建使用
# 版本控制 # 1. 配置文件中加入 REST_FRAMEWORK = { # 全局配置版本 # "DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.QueryParameterVersioning", # # 配置默認允許版本 # "ALLOWED_VERSIONS": ["v1", "v2"], # # 配置默認版本 # "DEFAULT_VERSION": "v1", # # 配置參數 # "VERSION_PARAM": "version", # 還是推薦用 URLPathVersioning 的方式來控制版本更好用一些 "DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.URLPathVersioning", } # 2. 設置路由 urlpatterns = [ url(r‘^(?P<version>[v1|v2]+)/api/‘, include("api.urls")), ] # 3 獲取版本 request.version
ps:
通常我們是不會單獨給某個視圖設置版本控制的,如果你確實需要給單獨的視圖設置版本控制,你可以在視圖中設置versioning_class屬性
class PublisherViewSet(ModelViewSet): ... versioning_class = URLPathVersioning
在視圖中自定義具體的行為,不同的版本返回不同的序列化類
class PublisherViewSet(ModelViewSet): def get_serializer_class(self): """不同的版本使用不同的序列化類""" if self.request.version == ‘v1‘: return PublisherModelSerializerVersion1 else: return PublisherModelSerializer queryset = models.Publisher.objects.all()
9.5 rest framework 分頁,版本