1. 程式人生 > 實用技巧 >路由元件與檢視集中附加action的宣告

路由元件與檢視集中附加action的宣告

一 路由Routers

對於檢視集ViewSet,我們除了可以自己手動指明請求方式與動作action之間的對應關係外,還可以使用Routers來幫助我們快速實現路由資訊。

REST framework提供了兩個router

  • SimpleRouter
  • DefaultRouter

1.1 使用方法

1) 建立router物件,並註冊檢視集,例如

1
2
3
4
from rest_framework import routers

router = routers.SimpleRouter()
router.register(r'router_stu', StudentModelViewSet, base_name='student'
)

register(prefix, viewset, base_name)

  • prefix 該檢視集的路由字首
  • viewset 檢視集
  • base_name 路由別名的字首

如上述程式碼會形成的路由如下:

1
2
^books/$    name: book-list
^books/{pk}/$ name: book-detail

2)新增路由資料

可以有兩種方式:

1
2
3
4
urlpatterns = [
...
]
urlpatterns += router.urls

1
2
3
4
urlpatterns = [
...
url(r'^'
, include(router.urls))

]

1.2 程式碼演示

使用路由類給檢視集生成了路由地址

1
2
3
4
5
6
7
8
9
10
# 必須是繼承ModelViewSet的檢視類才能自動生成路由
from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet
classStudentModelViewSet(ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer
# 這種方法不會自動生成,需要用action配置

deflogin(self,request):
"""學生登入功能"""
print(self.action)
return Response({"message":"登入成功"})

路由程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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動作的宣告。

1.2 檢視集中附加action的宣告

在檢視集中,如果想要讓Router自動幫助我們為自定義的動作生成路由資訊,需要使用rest_framework.decorators.action裝飾器。

以action裝飾器裝飾的方法名會作為action動作名,與list、retrieve等同。

action裝飾器可以接收兩個引數:

  • methods: 宣告該action對應的請求方式,列表傳遞

  • detail

    : 宣告該action的路徑是否與單一資源對應,及是否是

    1
    xxx/<pk>/action方法名/
    • True 表示路徑格式是xxx/<pk>/action方法名/
    • False 表示路徑格式是xxx/action方法名/

舉例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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=False)
deflogin(self, request):
return Response({'msg':'登陸成功'})

@action(methods=['put'], detail=True)
defget_new_5(self, request,pk):
return Response({'msg':'獲取5條資料成功'})

由路由器自動為此檢視集自定義action方法形成的路由會是如下內容:

1
2
^router_stu/get_new_5/$    name: router_stu-get_new_5
^router_stu/{pk}/login/$ name: router_stu-login

1.3 路由router形成URL的方式

1) SimpleRouter

2)DefaultRouter

DefaultRouter與SimpleRouter的區別是,DefaultRouter會多附帶一個預設的API根檢視,返回一個包含所有列表檢視的超連結響應資料。