1. 程式人生 > >Django-rest-framework(四)router

Django-rest-framework(四)router

list code iss 所有 介紹 方式 rest gis att

在上一節viewsets中,我們提到了route的方式使用,在這一節,我們將仔細介紹drf 的router機制。簡單來說,router的作用就是將viewset對象的url映射關系提取出來。

簡單使用

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 用兩個參數,

  • prefix route中url的前綴
  • viewset 對應的viewset類
  • basename 創建url的名字,默認是viewset的queryset,所以如果viewset類中沒用queryset屬性,必須設置basename

額外的action

在之前的介紹中,我們知道, viewset裏面我們可以通過繼承不同的mixins來實現列表,詳情,增加,修改,部分修改,刪除種不同功能的接口。可是在實際情況中,我們需要的不僅僅是這些,所以,我們需要額外的url來路由。於是引入了action裝飾器,我們可以在viewset中添加額外的路由了,使用方法:

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

DefaultRouter

前面我們介紹時使用的是SimpleRouterDefaultRouter與之不同的是,它帶了一個api root view,返回了包viewset中包含的所有action的超鏈接。

官方文檔上還介紹了自定義routers的方法,因為暫時還沒用到過,所以對這部分不做介紹

Django-rest-framework(四)router