REST框架包括一個(gè)用于抽象處理的ViewSets,允許開發(fā)人員集中精力對API的狀態(tài)和交互進(jìn)行建模,并根據(jù)常見約定自動(dòng)處理URL構(gòu)造。Viewset 類和 View類相似,但提供的是read或update,而不是http動(dòng)作get或put。目前,一個(gè)ViewSet類只綁定一個(gè)方法的集合,當(dāng)它被實(shí)例化為視圖的集合時(shí),一般使用為你處理復(fù)雜的URL定義的Router類。
使用視圖集viewsets
重構(gòu)類視圖
讓我們來用視圖集重寫當(dāng)前視圖。 首先,我們要把我們的ArticleListleView視圖重寫成單個(gè)ArticleViewSet。
views.py
from rest_framework import viewsets
class ArticleViewSet(mixins.ListModelMixin, mixins.CreateModelMixin, viewsets.GenericViewSet):
queryset = Article.objects.all() # 查詢結(jié)果集
serializer_class = ArticleSerializer # 序列化類
url配置
當(dāng)我們定義URLConf時(shí),處理方法只綁定到動(dòng)作。為了看看發(fā)生了什么,我們必須從我們的視圖集(ViewSets)創(chuàng)建一個(gè)視圖集合。在urls.py文件中,我們將ViewSet類綁定到具體視圖的集合。
article_list = ArticleViewSet.as_view({
'get': 'list',
'post': 'create'
})
urlpatterns = [
# path('articles/', ArticleListleView.as_view(), name='article_list' ) 修改為下面配置
path('articles/', article_list, name='article_list'),
]
測試效果

注意:我們?nèi)绾瓮ㄟ^將每個(gè)視圖的http方法綁定到所需的操作,從每個(gè)ViewSet類創(chuàng)建多個(gè)視圖。
使用路由routers
我們現(xiàn)在使用的是使用ViewSet類而不是View類,我們不需要定義我們的url,我們使用routers,我們需要做的只是用一個(gè)路由注冊合適的視圖集合。使用Router類就可以自動(dòng)將資源與視圖(views)、鏈接(urls)聯(lián)系起來。
修改urls.py:
from rest_framework.routers import DefaultRouter
# article_list = ArticleViewSet.as_view({
# 'get': 'list',
# 'post': 'create'
# })
router = DefaultRouter()
router.register('articles', ArticleViewSet)
urlpatterns = [
#path('articles/', article_list, name='article_list'),
path('', include(router.urls)),
]
用路由注冊視圖和提供一個(gè)urlpattern是相似的,包括兩個(gè)參數(shù)-->視圖的URL前綴和視圖本身。
我們使用的默認(rèn)路由(DefaultRouter)類會(huì)自動(dòng)為我們創(chuàng)建API根視圖,所以我們就可以從我們的views模塊刪除api_root方法。
views和viewsets的比較
使用視圖集(viewsets)真的很有用。它保證URL規(guī)范存在你的API中,讓你寫最少的代碼,
允許你把注意力集中在你的API提供的交互和表現(xiàn)上而不需要特定的URL配置。這并不意味著這樣做總是正確的。
在使用基于類的視圖代替基于函數(shù)的視圖時(shí),我們總會(huì)發(fā)現(xiàn)views與viewsets有相似的地方。
使用視圖集(viewsets)沒有比你自己的視圖更清晰。