在上一節viewsets中,咱們提到了route的方式使用,在這一節,咱們將仔細介紹drf 的router機制。簡單來講,router的做用就是將viewset對象的url映射關係提取出來。python
from rest_framework import routers router = routers.SimpleRouter() router.register(r'users', UserViewSet, basename="user") router.register(r'accounts', AccountViewSet) # urlpatterns = router.urls urlpatterns = [ url(r'^api/', include((router.urls, 'app_name'))), ]
register 用兩個參數,api
prefix
route中url的前綴viewset
對應的viewset類basename
建立url的名字,默認是viewset的queryset,因此若是viewset類中沒用queryset屬性,必須設置basename在以前的介紹中,咱們知道, viewset裏面咱們能夠經過繼承不一樣的mixins來實現列表,詳情,增長,修改,部分修改,刪除種不一樣功能的接口。但是在實際狀況中,咱們須要的不單單是這些,因此,咱們須要額外的url來路由。因而引入了action
裝飾器,咱們能夠在viewset中添加額外的路由了,使用方法:app
from myapp.permissions import IsAdminOrIsSelf from rest_framework.decorators import action class UserViewSet(ModelViewSet): ... @action(methods=['post'], detail=True, permission_classes=[IsAdminOrIsSelf]) def set_password(self, request, pk=None):
Note 在以前舊的版本使用的是detail_route,list_route連個裝飾器來添加額外的路由,用來區別url中是否有pk字段。action裝飾器則是經過detail字段來區別
使用上面action生成的url是 ^users/{pk}/set_password/$
。 若是不想使用方法的名字來作路由,能夠在action中指定url_name
。post
前面咱們介紹時使用的是SimpleRouter
,DefaultRouter
與之不一樣的是,它帶了一個api root view,返回了包viewset中包含的全部action的超連接。url
官方文檔上還介紹了自定義routers的方法,由於暫時還沒用到過,因此對這部分不作介紹rest