6.drf中各類View

Rest中的View

(1)使用Drf中的Serializer

其他的包

1531818167128.png

其中django-guardian是用來寫api文檔的

序列化

之前我們已經(jīng)講了如何只使用Python對(duì)數(shù)據(jù)進(jìn)行序列化顯示,這次我們使用drf中的序列化工具

文檔地址:http://www.django-rest-framework.org/tutorial/1-serialization/

1.創(chuàng)建Serializer類(用來自定義對(duì)數(shù)據(jù)的序列化和反序列化操作)

1531819281706.png

首先在view.py同級(jí)目錄下創(chuàng)建一個(gè)Serializer.py文件。

另外我們應(yīng)用了drf中的serializer內(nèi)容

其中我們只引用了model類中的一個(gè)字段name和id,其中read_only是必須要填寫的字段,其他的可以看文檔

地址:http://www.django-rest-framework.org/api-guide/fields/

create是創(chuàng)建數(shù)據(jù)時(shí)所需要的(已經(jīng)包裝好自帶)

update是修改數(shù)據(jù)時(shí)所需要的(已經(jīng)包裝好)

引用到View中

我們已經(jīng)寫好了Serializer文件,接下來我們只需要在View中對(duì)其進(jìn)行數(shù)據(jù)操作就行了


1531819507545.png
1531819532816.png

問題

我們會(huì)發(fā)現(xiàn)當(dāng)我們寫serializer的時(shí)候,他的代碼其實(shí)和django中的Form表單很相似(樣子上很像是),因此他也存在form的問題,就是當(dāng)我們字段一旦過多,就會(huì)出現(xiàn)工作重復(fù)量多。在Form中使用了ModelForm簡化了這個(gè)操作,因此在Serializer也可以使用ModelSerializer簡化這些操作

2.使用ModelSerializer

文檔

地址:http://www.django-rest-framework.org/tutorial/1-serialization/

變動(dòng)

我們只需要將之前寫好的Serializer.py中的內(nèi)容修改成ModelSerializer就可以了

1531820075838.png

fields必須是兩個(gè)及兩個(gè)以上

fields = "____all____" 則表示所有字段

其實(shí)進(jìn)入源碼我們會(huì)發(fā)現(xiàn),他已經(jīng)給我們定義好了create和update,因此他已經(jīng)可以實(shí)現(xiàn)簡單的創(chuàng)建和更新,當(dāng)然如果內(nèi)容復(fù)雜,我們可以重寫這兩個(gè)函數(shù)

1531838804182.png

嵌套

由于我們的category是一個(gè)外鍵,他之下還包含了更多的內(nèi)容

因此我們只需要重新寫一個(gè)serializer,并且實(shí)例化category就可以了

1531839111364.png
1531839116988.png

(2)使用drf中的不同種類的view

關(guān)系

drf中存在多種多樣的View,且不同的View都存在繼承上一個(gè)View,但最終都繼承至django.view,generic中的View

他們只是繼承并添加了不同功能的mixin

1.APIview

文檔

地址:http://www.django-rest-framework.org/tutorial/3-class-based-views/

1.我們之前已經(jīng)寫過Serializer了,因此這里不再寫了

2.對(duì)View.py進(jìn)行操作

1531817557345.png

1)這是文檔中的一個(gè)案例,其中snippets是我們的一個(gè)model,這里引入Serializer和model

2)接下來引入ApiView(看源碼我們會(huì)發(fā)現(xiàn)APIView是繼承自View的)

3)引入rest_framework中的Response (不懂可以看文檔第二章http://www.django-rest-framework.org/tutorial/2-requests-and-responses/

同理,我們對(duì)我們的項(xiàng)目也可以這么做

1531838004489.png

1531838017547.png

當(dāng)然,如果我們需要向django項(xiàng)目一樣,在url地址中加入其他的內(nèi)容,這些函數(shù)也可以傳入?yún)?shù)


1531838098705.png

1531838105960.png

之后會(huì)講到

(3)使用Mixins

Mixins在我看來相當(dāng)于一個(gè)混入的功能模塊,每一種Mixins都代表了一種功能或者一些功能

1531839970985.png

APIview

1531840027119.png

其實(shí)ListModelMixin種已經(jīng)封裝了一部分我們在APIview種的代碼

1531840108663.png

在GenericApiView里面封裝了獲取serializer名稱的方法

1531840350037.png

這里只是使用了get方法收集參數(shù)并進(jìn)行傳遞

注:如果不寫get,會(huì)出現(xiàn)錯(cuò)誤,因?yàn)樗麜?huì)默認(rèn)你不接受get請(qǐng)求

(4)使用GengricView

其實(shí)在Generic中已經(jīng)幫我們定義好了相應(yīng)的方法,我們只需要調(diào)用就可以了

1531840638285.png
1531840644004.png

相同的,他還定義了

1531840659732.png
1531840668613.png

等等的內(nèi)容,就是他將mixins功能塊封裝了起來,我們只需要調(diào)用他的View內(nèi)容就可以了。

(5)使用ViewSet和路由器

文檔:

地址:http://www.django-rest-framework.org/tutorial/6-viewsets-and-routers/

什么是ViewSet

谷歌翻譯將他翻譯成視圖集,即一個(gè)通用的視圖集合

實(shí)踐

之前我們所用的generics.ListAPIView中


1531887002002.png

分別繼承了這兩個(gè)類(GenericAPIView ,以及Mixins.ListModelMixin),這次我們使用ViewSet也需要這樣

首先我們先繼承viewsets.GenericViewSet

1531887091025.png

我們會(huì)發(fā)現(xiàn)

1531887111491.png

他給我們添加了一個(gè)新的Mixin功能,并且繼承了GenericAPIView ,但是并沒有繼承Mixins.ListModelMixin,因此我們還需要添加這個(gè)功能(這個(gè)功能是用來獲取list列表的)


1531887261480.png

再來說一說ViewSetMixin這個(gè)功能

1531887373472.png

他重寫了我們的as_view方法

他將采用字典的形式獲取參數(shù)(文檔中給出了例子)

因此我們將要修改urls.py中的寫法

1531887829822.png

當(dāng)然你也可以這樣寫

1531887880023.png

隱藏Mixins

1531888008374.png

其實(shí)他也封裝好了一些內(nèi)容來供我們使用

1531888030549.png

路由

我們之前再url中配置了內(nèi)容,但是頻繁的出現(xiàn)get list post create會(huì)出現(xiàn)工作量大的可能性,因此這里出現(xiàn)里路由器

1531888322037.png

我們只需要將我們的viewSet注冊到router中,再調(diào)用router.urls來匹配就可以了

1531888495515.png
1531888507018.png

總結(jié)

View,ApiView,GengricView,GenericViewSet,Router,Mixin

在Mixin中一共有5個(gè)分別是

CreateModelMixin(post,增),

ListModelMixin(get,查),

RetrieveModelMixin(get,附帶參數(shù))

UpdateModelMixin(put/patch,改)

DestroyModelMixin(delete,刪)

1531889929757.png

層級(jí)關(guān)系

View是屬于django的,

ApiView繼承自View(但他是屬于drf中的)

1531889625702.png
1531889632246.png

GengricApiView繼承自ApiView(屬于drf中的)

并且他是一個(gè)父類,所有的增刪改查功能繼承這個(gè)父類之后,再繼承一個(gè)mixin功能

1531890147779.png

GenericViewSet繼承自GenericAPIView(屬于drf中的),并且添加了一個(gè)ViewSetMixin功能(重寫了view)

分別繼承了其他的功能后成為了新的viewset

1531890566393.png

多使用,多練習(xí)

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

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

  • 你好 Django REST Framework 在第二章,我們學(xué)習(xí)了 REST 開發(fā)的基本知識(shí),并且在沒有借助任...
    ucag閱讀 4,579評(píng)論 5 16
  • 版權(quán): https://github.com/haiiiiiyun/awesome-django-cn Aweso...
    若與閱讀 23,558評(píng)論 3 240
  • Django: csrf防御機(jī)制 csrf攻擊過程 1.用戶C打開瀏覽器,訪問受信任網(wǎng)站A,輸入用戶名和密碼請(qǐng)求登...
    lijun_m閱讀 1,151評(píng)論 0 0
  • 一、基本視圖類 (APIView/@api_view) 1、類基礎(chǔ)視圖(APIView) DRF不同于django...
    入間閱讀 4,210評(píng)論 0 3
  • 2017.1.7日,我從男朋友口中得知了他爸爸肝癌晚期的事。 異地戀,那天我們打電話了,他哭得像個(gè)孩子。 7...
    土檸萌閱讀 267評(píng)論 0 0

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