一 路由Routers
對于視圖集ViewSet,我們除了可以自己手動指明請求方式與動作action之間的對應關系外,還可以使用Routers來幫助我們快速實作路由資訊,
REST framework提供了兩個router
- SimpleRouter
- DefaultRouter
1.1 使用方法
1) 創建router物件,并注冊視圖集,例如
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'router_stu', StudentModelViewSet, base_name='student')
register(prefix, viewset, base_name)
- prefix 該視圖集的路由前綴
- viewset 視圖集
- base_name 路由別名的前綴
如上述代碼會形成的路由如下:
^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動作的宣告,
1.2 視圖集中附加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.3 路由router形成URL的方式
1) SimpleRouter

2)DefaultRouter

DefaultRouter與SimpleRouter的區別是,DefaultRouter會多附帶一個默認的API根視圖,回傳一個包含所有串列視圖的超鏈接回應資料,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/91838.html
標籤:Python
上一篇:云短信免費網站分享
下一篇:while回圈,for回圈
