對於視圖集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根視圖
上面的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