drf 之路由


一 路由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

image-20200708225123044

1.3 路由router形成URL的方式

1) SimpleRouter

SimpleRouter

image-20200708224438048

2)DefaultRouter

DefaultRouter

image-20200708224355882

DefaultRouter與SimpleRouter的區別是,DefaultRouter會多附帶一個默認的API根視圖,返回一個包含所有列表視圖的超鏈接響應數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM