Rest中的View
(1)使用Drf中的Serializer
其他的包

其中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ù)的序列化和反序列化操作)

首先在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ù)操作就行了


問題
我們會(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就可以了

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ù)

嵌套
由于我們的category是一個(gè)外鍵,他之下還包含了更多的內(nèi)容
因此我們只需要重新寫一個(gè)serializer,并且實(shí)例化category就可以了


(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)行操作

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)目也可以這么做


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


之后會(huì)講到
(3)使用Mixins
Mixins在我看來相當(dāng)于一個(gè)混入的功能模塊,每一種Mixins都代表了一種功能或者一些功能

APIview

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

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

這里只是使用了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)用就可以了


相同的,他還定義了


等等的內(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中

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

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

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

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

他重寫了我們的as_view方法
他將采用字典的形式獲取參數(shù)(文檔中給出了例子)
因此我們將要修改urls.py中的寫法

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

隱藏Mixins

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

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

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


總結(jié)
View,ApiView,GengricView,GenericViewSet,Router,Mixin
在Mixin中一共有5個(gè)分別是
CreateModelMixin(post,增),
ListModelMixin(get,查),
RetrieveModelMixin(get,附帶參數(shù))
UpdateModelMixin(put/patch,改)
DestroyModelMixin(delete,刪)

層級(jí)關(guān)系
View是屬于django的,
ApiView繼承自View(但他是屬于drf中的)


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

GenericViewSet繼承自GenericAPIView(屬于drf中的),并且添加了一個(gè)ViewSetMixin功能(重寫了view)
分別繼承了其他的功能后成為了新的viewset

多使用,多練習(xí)