這篇主要是針對(duì)於個(gè)人目前學(xué)習(xí)django rest framework的一些小小心得,在開(kāi)發(fā)django而言,想要撰寫(xiě)restful api,是有幾個(gè)套件可以選擇的 主要而言是這兩個(gè),個(gè)人是學(xué)django rest framework,tastypie個(gè)人沒(méi)啥碰所以就不做啥比較了,當(dāng)然你也可以不屑使用上面這兩個(gè),小弟有看過(guò)使用requests來(lái)實(shí)作api的 :) 大致上這篇會(huì)用下列的順序介紹
core part個(gè)人覺(jué)得這套主要核心整個(gè)圍繞在 這邊rest framework的quick start個(gè)人覺(jué)得做了一個(gè)很簡(jiǎn)單上手的示範(fàn),讓你先了解一些基本概念,serializer的基本使用方法,如果有看他source code,可以看到他的概念就是從django form,field那些過(guò)來(lái)的,所以會(huì)有很多類(lèi)似的東西,至於serializer比較深的東西,下一個(gè)段落再來(lái)多說(shuō)明。 quick start 後面也提到class based view的使用方式,不過(guò)他是從function based view帶到class based view,個(gè)人比較偏好class based view,可讀性更好,假如你一個(gè)function based view可接受很多http method,這樣裏面code就一定會(huì)參雜各種method的相對(duì)應(yīng)code,很可能你裏面就會(huì)有向下面這樣
沒(méi)有說(shuō)那種一定好一定壞,就看客官的個(gè)人喜好囉~~ 再來(lái)
permission是裡面所有的permission都過(guò)了,這個(gè)request才可以執(zhí)行,authentication是只要裏面有一個(gè)成功通過(guò),那就可以執(zhí)行了。 不信請(qǐng)看,rest framework源碼片斷
最後的core part,就是viewset和router了,這部份就在url router那邊再多做說(shuō)明。 serializerserizlier跟django的Form使用起來(lái)很像,但是這不代表它是繼承於django的form喔,有興趣的看源碼,用serializer的目的,個(gè)人是覺(jué)得把表單驗(yàn)證的邏輯(舉凡參數(shù)驗(yàn)證也可)從api view切開(kāi),這樣也不會(huì)讓api裏面的程式碼過(guò)於複雜。 一般而言大多數(shù)情況應(yīng)該都是使用modelserializer,的確針對(duì)於CRUD方面確實(shí)方便,但是有時(shí)候就是會(huì)遇到當(dāng)你create這個(gè)model時(shí),會(huì)有和model對(duì)不上的欄位,進(jìn)而造成錯(cuò)誤發(fā)生,或是很難使用,拿個(gè)最簡(jiǎn)單的例子,創(chuàng)造一個(gè)使用者,通常會(huì)需要一個(gè)email,password,password2,但是使用者model並不會(huì)有password2,畢竟那只是確認(rèn)使用者密碼是不是一致。 對(duì)於這種情形,我是另外寫(xiě)一個(gè)serializer專(zhuān)門(mén)為創(chuàng)造使用者,而且也不是用ModelSerializer,只是一般的serializer,那記得要define create的method,假如你是要用在generic viewset的create的這地方。 另外使用modelserializer會(huì)遇到的一種情況是,今天你想要客製化回傳的資料,比如今天你的user model裏面有一個(gè)欄位是mugshot(ImageField),那個(gè)一般情況UserSerializer.data,那麼回傳格式通常會(huì)是希望是大概如下
但是往往天不從人願(yuàn),預(yù)設(shè)可不是回傳url位址,像這種情況我目前知道的算比較OK的解法有兩種 第1種就是使用SerializerMethodField,基本上就是建立一個(gè)readonly的field,使用方法文檔說(shuō)明了很清楚,這邊我就不多說(shuō)明~~ 第2種就是overwride serializer的 再來(lái)就是文檔的地方也有說(shuō),使用serializer時(shí),帶入partial這個(gè)參數(shù)是可以直接partiali update或是其他的東東,這是一個(gè)不錯(cuò)用的東西~~
最後其實(shí)剛剛上述的對(duì)於creation的用途另外寫(xiě)一個(gè)專(zhuān)用的serializer,你也可以不要這樣寫(xiě),就全都寫(xiě)在同樣的serializer上,用上面的userserializer繼續(xù)舉例:
|
|
來(lái)自: 印度阿三17 > 《開(kāi)發(fā)》