DRF的路由生成類的使用

DRF路由生成類的使用

對於視圖集ViewSet,咱們除了能夠本身手動指明請求方式與動做action之間的對應關係外,還能夠使用Routers來幫助咱們快速實現路由信息。django

REST framework提供了兩個routerapi

  • SimpleRouter函數

  • DefaultRouterurl

使用方法

1) 建立router對象,並註冊視圖集,例如spa

from rest_framework import routers router = routers.SimpleRouter() router.register(r'books', BookInfoViewSet, base_name='book')

register(prefix, viewset, base_name)rest

  • prefix 該視圖集的路由前綴code

  • viewset 視圖集router

  • base_name 路由名稱的前綴對象

如上述代碼會造成的路由以下:blog

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

2)添加路由數據

能夠有兩種方式: urlpatterns = [ ... ] urlpatterns += router.urls 或 urlpatterns = [ ... url(r'^', include(router.urls)) ]

在views.py中操做完視圖函數後,路由咱們能夠用drf中自帶的路由類,route,

它或會幫助咱們將視圖函數的增刪改查都自動生成

from rest_framework.routers import DefaultRouter

案例說明:

serializers.py

# 建立一個Bookinfo 序列化器
from rest_framework import serializers from .models import BookInfo class BookInfoSerializer(serializers.ModelSerializer): class Meta: model = BookInfo fields = '__all__'

views.py

from django.shortcuts import render # Create your views here.
from rest_framework.viewsets import ModelViewSet from .serializers import BookInfoSerializer from .models import BookInfo class BookInfoViewSet(ModelViewSet): queryset = BookInfo.objects.all() serializer_class = BookInfoSerializer

urls.py

from . import views from rest_framework.routers import DefaultRouter urlpatterns = [ ] route = DefaultRouter() # route.register("路由地址的前綴", 視圖集類) # 
route.register(r"books", views.BookInfoViewSet) # 
 urlpatterns += route.urls

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

api根視圖

另外附加說明:視圖集中附加action的聲明

上面的route路由自動會產生增刪改查的路由,可是若是我要訪問自定義的那個視圖函數,它是不會自動產生的

好比在views.py 文件中建立了一個查詢  這個圖書的前五名閱讀量的視圖函數,可是route類並無給我產生,我該怎麼辦呢?

這個時候就用到了附加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 import mixins from rest_framework.viewsets import GenericViewSet from rest_framework.decorators import action class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet): queryset = BookInfo.objects.all() serializer_class = BookInfoSerializer # detail爲False 表示路徑名格式應該爲 books/latest/
    @action(methods=['get'], detail=False) def latest(self, request): """ 返回最新的圖書信息 """ ... # detail爲True,表示路徑名格式應該爲 books/{pk}/read/
    @action(methods=['put'], detail=True) def read(self, request, pk): """ 修改圖書的閱讀量數據 """ ...

由路由器自動爲此視圖集自定義action方法造成的路由會是以下內容:

^books/latest/$    name: book-latest ^books/{pk}/read/$  name: book-read
相關文章
相關標籤/搜索