rest_framework之解析器、路由控制、分頁
阿新 • • 發佈:2018-05-21
控制 img 其他 http 只需要 api 參數 字符 route
解析器
我們都知道,網絡傳輸數據只能傳輸字符串格式的,如果是列表、字典等數據類型,需要轉換之後才能使用
但是我們之前的rest_framework例子都沒有轉換就直接可以使用了,這是因為rest_framework有一套解析器,
默認他會幫我們轉換3種類型的數據,分別是,JSONParser,FormParser,MultiPartParser
而如果我們需要轉換其他數據,需要在視圖類裏配置parser_classes參數,如下:
from rest_framework.parsers import JSONParser,FormParser,MultiPartParser,FileUploadParser parser_classes = [JSONParser,FormParser,FileUploadParser]
路由控制
我們之前在寫例子的時候,視圖類已經封裝到最精簡版本了,但是url變的比之前復雜了,如下:
url(r‘^publishes/$‘, views.PublishViewSet.as_view({‘get‘:‘list‘,‘post‘:‘create‘})), url(r‘^publishes/(?P<pk>\d+)/$‘, views.PublishViewSet.as_view({‘get‘:‘retrieve‘,‘put‘:‘update‘,‘delete‘:‘destroy‘,‘patch‘:‘partial_update‘})),
上面只是一個視圖類對應的url,如果項目做的很大,那麽url會變的非常臃腫,
而rest_framework給我們封裝了一種自動註冊url的功能,格式如下:
from django.conf.urls import url from django.contrib import admin from app01 import views from django.conf.urls import include from rest_framework import routers # 實例化一個routers對象 routers = routers.DefaultRouter() # 往對象裏註冊(添加)url routers.register(‘publishes‘,views.PublishViewSet)
然後,在urlpatterns中添加已經註冊的url(在routers.urls裏),如下:
url(r‘‘,include(routers.urls))
完整版的urlpatterns配置
urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^login/‘, views.Login.as_view()), url(r‘^authors/$‘, views.AuthorsView.as_view()), url(r‘^authors/(\d+)/$‘, views.AuthorsDetailView.as_view()), url(r‘‘,include(routers.urls)) ]
這個時候,rest_framework會幫我們自動添加了4個url,如下圖:
分頁
繼承APIView類的視圖中添加分頁
from rest_framework.pagination import PageNumberPagination class MyPageNumberPagination(PageNumberPagination): # 定義一個PageNumberPagination的子類 # 如需改變參數,重寫其屬性即可 page_size = 6 #每頁顯示條數 page_query_param = ‘page‘ # url中的參數的key page_size_query_param="size" # 可以在url中使用size參數臨時改變當頁顯示的數目 max_page_size=10 # 可以在url中使用size參數臨時改變當頁顯示的數目,但是最大只能顯示10條 class AuthorsView(APIView): def get(self,request): ‘‘‘分頁展示作者列表‘‘‘ author_list = models.Author.objects.all() # 分頁 # 實例化一個自己定義的MyPageNumberPagination對象 pnp = MyPageNumberPagination() # 調用paginate_queryset方法來生成新的author_list # 參數分別為,author_list,request以及當前的視圖 page_author_list = pnp.paginate_queryset(author_list,request,self) # 在將新生成的page_author_list序列化 auts = serializer.AuthorModelSerializers(page_author_list,many=True) return Response(auts.data)
繼承ModelViewSet類的視圖中添加分頁
如果我們的視圖繼承了ModelViewSet類,那麽如需分頁的時候,只需要在視圖類中加入配置參數即可,如下:
pagination_class = MyPageNumberPagination
註意:
1、MyPageNumberPagination類是我們自己定義的類,見上面一個示例。
2、pagination_class後面直接跟上類名即可,無需加列表(因為分頁不想其他組件,分頁只可能有一個)
全局配置分頁屬性
只需要在REST_FRAMEWORK配置中加入 配置屬性的鍵值對即可,如下:
REST_FRAMEWORK = { ..... "PAGE_SIZE":1 }
rest_framework之解析器、路由控制、分頁