Rest中的View
(1)使用Drf中的Serializer
其他的包
其中django-guardian是用來寫api文檔的
序列化
之前我們已經(jīng)講了如何只使用Python對數(shù)據(jù)進(jìn)行序列化顯示狱窘,這次我們使用drf中的序列化工具
文檔地址:http://www.django-rest-framework.org/tutorial/1-serialization/
1.創(chuàng)建Serializer類(用來自定義對數(shù)據(jù)的序列化和反序列化操作)
首先在view.py同級目錄下創(chuàng)建一個Serializer.py文件围肥。
另外我們應(yīng)用了drf中的serializer內(nèi)容
其中我們只引用了model類中的一個字段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中對其進(jìn)行數(shù)據(jù)操作就行了
問題
我們會發(fā)現(xiàn)當(dāng)我們寫serializer的時(shí)候肥印,他的代碼其實(shí)和django中的Form表單很相似(樣子上很像是)性锭,因此他也存在form的問題孵班,就是當(dāng)我們字段一旦過多涉兽,就會出現(xiàn)工作重復(fù)量多。在Form中使用了ModelForm簡化了這個操作篙程,因此在Serializer也可以使用ModelSerializer簡化這些操作
2.使用ModelSerializer
文檔
地址:http://www.django-rest-framework.org/tutorial/1-serialization/
變動
我們只需要將之前寫好的Serializer.py中的內(nèi)容修改成ModelSerializer就可以了
fields必須是兩個及兩個以上
fields = "____all____" 則表示所有字段
其實(shí)進(jìn)入源碼我們會發(fā)現(xiàn)枷畏,他已經(jīng)給我們定義好了create和update,因此他已經(jīng)可以實(shí)現(xiàn)簡單的創(chuàng)建和更新虱饿,當(dāng)然如果內(nèi)容復(fù)雜拥诡,我們可以重寫這兩個函數(shù)
嵌套
由于我們的category是一個外鍵,他之下還包含了更多的內(nèi)容
因此我們只需要重新寫一個serializer氮发,并且實(shí)例化category就可以了
(2)使用drf中的不同種類的view
關(guān)系
drf中存在多種多樣的View渴肉,且不同的View都存在繼承上一個View,但最終都繼承至django.view,generic中的View
他們只是繼承并添加了不同功能的mixin
1.APIview
文檔
地址:http://www.django-rest-framework.org/tutorial/3-class-based-views/
1.我們之前已經(jīng)寫過Serializer了爽冕,因此這里不再寫了
2.對View.py進(jìn)行操作
1)這是文檔中的一個案例仇祭,其中snippets是我們的一個model,這里引入Serializer和model
2)接下來引入ApiView(看源碼我們會發(fā)現(xiàn)APIView是繼承自View的)
3)引入rest_framework中的Response (不懂可以看文檔第二章http://www.django-rest-framework.org/tutorial/2-requests-and-responses/)
同理扇售,我們對我們的項(xiàng)目也可以這么做
當(dāng)然前塔,如果我們需要向django項(xiàng)目一樣,在url地址中加入其他的內(nèi)容承冰,這些函數(shù)也可以傳入?yún)?shù)
之后會講到
(3)使用Mixins
Mixins在我看來相當(dāng)于一個混入的功能模塊,每一種Mixins都代表了一種功能或者一些功能
APIview
其實(shí)ListModelMixin種已經(jīng)封裝了一部分我們在APIview種的代碼
在GenericApiView里面封裝了獲取serializer名稱的方法
這里只是使用了get方法收集參數(shù)并進(jìn)行傳遞
注:如果不寫get食零,會出現(xiàn)錯誤困乒,因?yàn)樗麜J(rèn)你不接受get請求
(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
谷歌翻譯將他翻譯成視圖集百宇,即一個通用的視圖集合
實(shí)踐
之前我們所用的generics.ListAPIView中
分別繼承了這兩個類(GenericAPIView 考廉,以及Mixins.ListModelMixin),這次我們使用ViewSet也需要這樣
首先我們先繼承viewsets.GenericViewSet
我們會發(fā)現(xiàn)
他給我們添加了一個新的Mixin功能携御,并且繼承了GenericAPIView 昌粤,但是并沒有繼承Mixins.ListModelMixin,因此我們還需要添加這個功能(這個功能是用來獲取list列表的)
再來說一說ViewSetMixin這個功能
他重寫了我們的as_view方法
他將采用字典的形式獲取參數(shù)(文檔中給出了例子)
因此我們將要修改urls.py中的寫法
當(dāng)然你也可以這樣寫
隱藏Mixins
其實(shí)他也封裝好了一些內(nèi)容來供我們使用
路由
我們之前再url中配置了內(nèi)容啄刹,但是頻繁的出現(xiàn)get list post create會出現(xiàn)工作量大的可能性涮坐,因此這里出現(xiàn)里路由器
我們只需要將我們的viewSet注冊到router中,再調(diào)用router.urls來匹配就可以了
總結(jié)
View誓军,ApiView袱讹,GengricView,GenericViewSet昵时,Router捷雕,Mixin
在Mixin中一共有5個分別是
CreateModelMixin(post,增)壹甥,
ListModelMixin(get救巷,查),
RetrieveModelMixin(get,附帶參數(shù))
UpdateModelMixin(put/patch,改)
DestroyModelMixin(delete,刪)
層級關(guān)系
View是屬于django的盹廷,
ApiView繼承自View(但他是屬于drf中的)
GengricApiView繼承自ApiView(屬于drf中的)
并且他是一個父類征绸,所有的增刪改查功能繼承這個父類之后,再繼承一個mixin功能
GenericViewSet繼承自GenericAPIView(屬于drf中的)俄占,并且添加了一個ViewSetMixin功能(重寫了view)
分別繼承了其他的功能后成為了新的viewset
多使用管怠,多練習(xí)