對於視圖集ViewSet,咱們除了能夠本身手動指明請求方式與動做action之間的對應關係外,還可使用Routers來幫助咱們快速實現路由信息。django
REST framework提供了兩個routerurl
SimpleRouterspa
DefaultRouter3d
1) 建立router對象,並註冊視圖集,例如rest
from rest_framework import routers router = routers.DefaultRouter() router.register(r'router_stu', StudentModelViewSet, base_name='student')
register(prefix, viewset, base_name)code
prefix 該視圖集的路由前綴router
viewset 視圖集對象
base_name 路由別名的前綴blog
如上述代碼會造成的路由以下:資源
^books/$ name: book-list
^books/{pk}/$ name: book-detail
2)添加路由數據
能夠有兩種方式:
urlpatterns = [ ... ] urlpatterns += router.urls 或 urlpatterns = [ ... url(r'^', include(router.urls)) ]
使用路由類給視圖集生成了路由地址
from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet class StudentModelViewSet(ModelViewSet): queryset = Student.objects.all() serializer_class = StudentModelSerializer def login(self,request): """學生登陸功能""" print(self.action) return Response({"message":"登陸成功"})
路由代碼:
from django.urls import path, re_path from . import views urlpatterns = [ ... ] """使用drf提供路由類router給視圖集生成路由列表""" # 實例化路由類 # drf提供一共提供了兩個路由類給咱們使用,他們用法一致,功能幾乎同樣 from rest_framework.routers import DefaultRouter router = DefaultRouter() # 註冊視圖集 # router.register("路由前綴",視圖集類) router.register("router_stu",views.StudentModelViewSet) # 把生成的路由列表追加到urlpatterns print( router.urls ) urlpatterns += router.urls
上面的代碼就成功生成了路由地址[增/刪/改/查一條/查多條的功能],可是不會自動咱們在視圖集自定義方法的路由。
因此咱們若是也要給自定義方法生成路由,則須要進行action動做的聲明。
在視圖集中,若是想要讓Router自動幫助咱們爲自定義的動做生成路由信息,須要使用rest_framework.decorators.action
裝飾器。
以action裝飾器裝飾的方法名會做爲action動做名,與list、retrieve等同。
action裝飾器能夠接收兩個參數:
methods: 聲明該action對應的請求方式,列表傳遞
detail
: 聲明該action的路徑是否與單一資源對應,及是不是
xxx/<pk>/action方法名/
True 表示路徑格式是xxx/<pk>/action方法名/
False 表示路徑格式是xxx/action方法名/
舉例:
from rest_framework.viewsets import ModelViewSet from rest_framework.decorators import action class StudentModelViewSet(ModelViewSet): queryset = Student.objects.all() serializer_class = StudentModelSerializer # methods 設置當前方法容許哪些http請求訪問當前視圖方法 # detail 設置當前視圖方法是不是操做一個數據 # detail爲True,表示路徑名格式應該爲 router_stu/{pk}/login/ @action(methods=['get'], detail=True) def login(self, request,pk): """登陸""" ... # detail爲False 表示路徑名格式應該爲 router_stu/get_new_5/ @action(methods=['put'], detail=False) def get_new_5(self, request): """獲取最新添加的5個學生信息""" ...
由路由器自動爲此視圖集自定義action方法造成的路由會是以下內容:
^router_stu/get_new_5/$ name: router_stu-get_new_5
^router_stu/{pk}/login/$ name: router_stu-login
1) SimpleRouter
2)DefaultRouter
DefaultRouter與SimpleRouter的區別是,DefaultRouter會多附帶一個默認的API根視圖,返回一個包含全部列表視圖的超連接響應數據。
ok