django rest framework-視圖集(ViewSets)和路由(Routers)

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'),
]
測試效果

image.png

注意:我們?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)沒有比你自己的視圖更清晰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1, 序列化 Serialization 創(chuàng)建一個(gè)新環(huán)境 在做其他事之前,我們會(huì)用virtualenv創(chuàng)建一個(gè)新的...
    光著腳的鞋閱讀 747評(píng)論 0 1
  • : REST框架包括一個(gè)處理的抽象ViewSets,它允許開發(fā)人員集中精力對API的狀態(tài)和交互進(jìn)行建模,并根據(jù)常規(guī)...
    盛夏_264f閱讀 373評(píng)論 0 0
  • Request 與 Response RequestREST framework 傳入視圖的request對象不再...
    LiWei_9e4b閱讀 676評(píng)論 0 0
  • step1:創(chuàng)建模型 step2:創(chuàng)建一個(gè)Serializer類 開始使用Web API的第一件事是提供一...
    lijun_m閱讀 758評(píng)論 0 1
  • REST框架包括一個(gè)處理的抽象ViewSets,它允許開發(fā)人員集中精力對API的狀態(tài)和交互進(jìn)行建模,并根據(jù)常規(guī)約定...
    橙子丨Sunty閱讀 902評(píng)論 0 2

友情鏈接更多精彩內(nèi)容