對於視圖集ViewSet
,咱們除了能夠本身手動指明請求方式與動做action
之間的對應關係外,還可使用Routers
來幫助咱們快速實現路由信息。python
REST framework
提供了兩個router
shell
router
對象,並註冊視圖集,例如from rest_framework import routers router = routers.DefaultRouter() router.register(r'router_stu', StudentModelViewSet, base_name='student')
register ( prefix, viewset, base_name )
django
prefix
該視圖集的路由前綴viewset
視圖集base_name
路由別名的前綴如上述代碼會造成的路由以下:app
^books/$ name: book-list ^books/{pk}/$ name: book-detail
能夠有兩種方式:學習
urlpatterns = [ ... ] urlpatterns += router.urls
或url
urlpatterns = [ ... url(r'^', include(router.urls)) ]
使用路由類給視圖集生成了路由地址3d
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":"登陸成功"})
路由代碼:rest
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
上面的代碼就成功生成了路由地址[增/刪/改/查一條/查多條的功能]
,可是不會自動咱們在視圖集自定義方法的路由。code
因此咱們若是也要給自定義方法生成路由,則須要進行action
動做的聲明。router
在視圖集中,若是想要讓Router
自動幫助咱們爲自定義的動做生成路由信息,須要使用rest_framework.decorators.action
裝飾器。
以action
裝飾器裝飾的方法名會做爲action
動做名,與list
、retrieve
等同。
action
裝飾器能夠接收兩個參數:
action
對應的請求方式,列表傳遞聲明該action
的路徑是否與單一資源對應,及是不是
xxx/<pk>/action方法名/
xxx/<pk>/action方法名/
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): """登陸""" ... pass # detail爲False 表示路徑名格式應該爲 router_stu/get_new_5/ @action(methods=['put'], detail=False) def get_new_5(self, request): """獲取最新添加的5個學生信息""" ... pass
由路由器自動爲此視圖集自定義action方法造成的路由會是以下內容:
^router_stu/get_new_5/$ name: router_stu-get_new_5 ^router_stu/{pk}/login/$ name: router_stu-login
DefaultRouter
與SimpleRouter
的區別是,DefaultRouter
會多附帶一個默認的API
根視圖,返回一個包含全部列表視圖的超連接響應數據。
爲了方便接下來的學習,咱們建立一個新的子應用 opt
python manage.py startapp opt
由於接下來的功能中須要使用到登錄功能,因此咱們使用django
內置admin
站點並建立一個管理員.
python manage.py createsuperuser
建立管理員之後,訪問admin
站點,先修改站點的語言配置
settings.py
訪問admin
站點 : http://127.0.0.1:8000/admin/