Django rest_framework Serializer中的create、Views中的create/perform_create的區別

Django rest_framework Serializer中的create、Views中的create/perform_create的區別


對于后端來說,前后端分離的方式能讓前后端的開發都爽。和所有的爽一樣,每爽一次都要付出一定的代價。而前后端分離的代價,就是后端要面對巨量的模塊化的功能組件以及這些組件的常規用法與重寫復用。有一點經驗,關于[Django rest_framework ] Serializer中的create()、Views中的create()/perform_create()的區別,希望與諸君共討之。


1 Serializer 序列化器

1.1 Serializer作用

序列化器是rest_framework 其中的一個組件,它有兩個功能:

  • 序列化:把python中的對象轉成json/xml格式字符串。這里的對象指的是數據庫對象,因為rest_framework 用的ORM來操作數據庫。它的功能直觀上是將數據庫里面的數據,通過接口傳遞到前端,因為使用ORM的緣故,從數據庫到接口數據轉換的過程被描述成序列化,其實更準確的描述應該是[可傳輸化]或者[轉化為可以被前端直接使用的數據類型],這樣更便于理解。
  • 反序列化:把json/xml格式字符串轉成python中的對象。從功能上來說,反序列化是序列化的逆過程。但同樣的,從英語到漢語直譯的方式,總會帶來各種理解上的障礙。更準確地描述,應該是[字符串對象化]或者[可存儲化]。

和前后端不分離相比,Serializer承擔了一部分views

2.2 Serializer中的create

序列化()的過程一般是read操作,絕大多數情況下應該不涉及使用create()。所以Serializer重寫create()的情況只能是反序列化(字符串---->數據庫),也就是將接口數據保存到數據庫中。

  • Serializers中的create()方法

    
    from rest_framework import serializersclass MyModelSerializer(serializers.ModelSerializer):"""一個序列化器"""class Meta:model = MyModelfields = '__all__'# Serializers中的create()方法def create(self, validated_data):## your codereturn super().create(validated_data)
    

    上面的這一小段代碼,是一個典型的序列化器,在這里我們重寫了Serializer的create()。可以看到在這里的create()方法有一個validated_data參數,這意味著什么呢,我想聰明的你已經猜到了答案:即這個數據是從前端傳過來并且已經過了驗證(valide)。經過了誰的驗證呢,沒錯,是Serializer。可能許多人還記得Serializer提供了很多字段,類似models中的字段,當時我還在想,我說這玩意兒是用來干嘛的呢。現在回首,我想很多人像我一樣,也已豁然開朗。記著,永遠不要忘記Serializer的功能。舉個例子:

    from rest_framework import serializersclass MyModelSerializer(serializers.ModelSerializer):"""一個序列化器"""class Meta:model = MyModelfields = '__all__'# Serializers中的create()方法def create(self, validated_data):## your codereturn super().create(validated_data)# 定義的一個字段my_bool = BooleanField()
    

    上面我定義了一個字段:my_bool 。這個字段可接受的值是一個布爾值(0/1)。如果傳其他值,則會報錯。那么,很明顯的,Serializer中重寫create()方法的作用已然顯現:對Serializer已校驗的前端入參進行二次處理。默認情況下,serializer處理結束后,將會返回一個示例instance給視圖(這一點存疑)。

到此Serializer的作用應該是結束了。


2 Views 視圖

Serializer將校驗成功的數據給到views,views拿到數據之后,用來做持久化

2.1 views中的create()與perform_create()

在views中你可以重寫create(),并通過request.GET/request.POS/request.data拿到從前端傳過來并經過Serializer規則校驗的數據。
拿到之后呢?你可以對這些數據再次進行處理,或者將它作為調用其它接口的入參(這就是傳說中的對其它系統的接口進行二次封裝)。
視圖中的create(),與序列化器中的create()有一個巨大的區別是:視圖中的create()可以調用perform_create()進行持久化。這很棒棒,因為后端開發說白了就是對數據庫進行增刪改查(撇開使用不同框架的差異),而增刪改查的難易程度事實上取決于你要解決的問題,即實際具體業務的復雜程度。


3 總結一下

  • Serializer主要是和前端打交道,so,基于這一點,你重寫Serializer的create(),本質是為了過濾。如果通過了校驗,并且滿足你的要求,那么它會到視圖中做下一步處理(通過過濾);反之,將會給前端反饋一些提示信息過去(被過濾)。
  • Views則相反,Views主要和后端打交道,你重寫Views的create(),本質是為了持久化。在持久化之前,你可以對入參做任何符合實際情況的處理(包括調用其它接口),但是因為是POST/create(),最終你還是要持久化(perform_create())。

以上 。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36071.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36071.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36071.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言實現插入排序

什么是插入排序? 插入排序(Insertion Sort) 是一種簡單且逐步構建有序序列的排序算法。它的思想是將數組分為兩部分:已排序的部分和未排序的部分。初始時,已排序部分只包含數組的第一個元素,然后逐步將未排…

Process.Start 報錯

Process.Start 報錯 System.Diagnostics.Process.StartWithShellExecuteEx Process.Start 為什么會引發“系統找不到指定的文件”異常 Process.Start 報錯 找不到路徑 ,System.ComponentModel.Win32Exception:“系統找不到指定的文件。 問題1、 在WinForm中可能是權限問題&…

做了這件事,精準拿捏企業資產管理!

資產管理系統是一種為組織和個人提供管理各類資產的重要工具。無論是金融資產還是實物資產,這些都構成了一個實體或個人財務狀況的重要組成部分。 無論是企業尋求優化其固定資產維護,還是個人希望更好地管理他們的投資組合,資產管理系統在現代…

NZ系列工具NZ02:VBA讀取PDF使用說明

【分享成果,隨喜正能量】時光綻放并蒂蓮,更是一份殷殷囑托,更是一份誠摯祝福,是一份時光饋贈,又是一份時光陪伴。。 我的教程一共九套及VBA漢英手冊一部,分為初級、中級、高級三大部分。是對VBA的系統講解…

“深入解析JVM:探索Java虛擬機的工作原理與優化技巧“

標題:深入解析JVM:探索Java虛擬機的工作原理與優化技巧 摘要:本文將深入探討Java虛擬機(JVM)的工作原理、內部結構以及如何優化Java應用程序的性能。我們將介紹JVM的主要組件,包括類加載器、運行時數據區域…

關于openssl SM2 ECC以及密鑰生成和簽名驗簽

SM2是基于ECC的國密算法,本身也是ECC算法。 openssl生成ECC公私鑰并簽名驗簽 #!/bin/sh openssl ecparam -genkey -name prime256v1 -out private.pem #print pri #openssl ec -in private.pem -text -noout openssl ec -in private.pem -pubout -out public.pem #gen test.…

uniapp+uview封裝小程序請求

提要: uniapp項目引入uview庫 此步驟不再闡述 1.創建環境文件 env.js: let BASE_URL;if (process.env.NODE_ENV development) {// 開發環境BASE_URL 請求地址; } else {// 生產環境BASE_URL 請求地址; }export default BASE_URL; 2.創建請求文件 該…

QLExpress動態腳本引擎解析工具

介紹 QLExpress腳本引擎 1、線程安全,引擎運算過程中的產生的臨時變量都是threadlocal類型。 2、高效執行,比較耗時的腳本編譯過程可以緩存在本地機器,運行時的臨時變量創建采用了緩沖池的技術,和groovy性能相當。 3、弱類型腳本…

廣西Geotrust單位多域名https證書推薦

Geotrust是國際知名CA認證機構,根證書是Digicert,還有RapidSSL、QuickSSL等子品牌,擁有多種類型的多域名https證書,比如OV企業型https證書和EV增強型多域名https證書。那么,哪種多域名https證書更適合企事業單位使用呢…

SpringBoot復習:(43)如何以war包的形式運行SpringBoot程序

一、.pom.xml配置packging為war <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven…

Android 內存泄漏

名詞解釋 內存泄漏:即memory leak。是指內存空間使用完畢后無法被釋放的現象&#xff0c;雖然Java有垃圾回收機制&#xff08;GC&#xff09;&#xff0c;但是對于還保持著引用&#xff0c; 該內存不能再被分配使用&#xff0c;邏輯上卻已經不會再用到的對象&#xff0c;垃圾回…

react如何實現數據渲染

React數據渲染是指將組件中的數據映射到頁面上&#xff0c;以展示出來。在React中&#xff0c;數據渲染通常是通過JSX和組件的state或props完成的。 JSX是一個類似HTML的語法&#xff0c;可以在其中嵌入JavaScript表達式。在JSX中&#xff0c;可以使用{}包裹JavaScript表達式&…

解決C語言中使用scanf輸入字符串導致for循環失效的問題

在C語言編程中&#xff0c;使用scanf函數輸入字符串是一項基本操作。然而&#xff0c;當我們嘗試在for循環中使用scanf輸入字符串時&#xff0c;可能會遇到意外的問題&#xff0c;導致循環無法正常執行。本文將深入探討這個問題&#xff0c;并提供解決方案&#xff0c;讓你能夠…

考公-判斷推理-定義判斷

第九節課 例題 例題 例題 例題 例題 例題 腳一滑&#xff0c;就是工傷&#xff0c;這難道不是操作不當嗎 例題 不要較真&#xff0c;公務員&#xff0c;把沒有全局觀念的人排除在公務員隊伍之外 例題 例題 下次看到不字&#xff0c;先給我畫上 例題 例題 例題 例題…

微信群聊微信機器人實現流程

1.注冊微信賬號 要使用一個微信機器人賬號來實現在微信群聊中的自動回復功能&#xff0c;你需要注冊一個專門用于機器人的微信賬號。 注冊微信機器人賬號的步驟如下&#xff1a; 下載微信&#xff1a;在手機或者電腦上下載并安裝微信應用程序。創建新賬號&#xff1a;打開微信…

力扣63.不同路徑II(動態規劃)

/*** author Limg* date 2022/08/09* 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。* 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish”&#xff09;。* 現在考慮網…

探討uniapp的生命周期問題

在uniapp中,生命周期函數分為應用生命周期函數、頁面生命周期函數和組件生命周期函數. 1應用聲明周期 應用生命周期函數只能在 App.vue 中監聽有效&#xff0c;在其他頁監聽無效。 onLaunch&#xff1a;當uni-app 初始化完成時觸發&#xff08;全局只觸發一次&#xff09;on…

鄉村振興指數與其30余個原始變量數據(2000-2022年)

鄉村振興是當下經濟學研究的熱點之一&#xff0c;對鄉村振興進行測度&#xff0c;是研究基礎。測度鄉村振興水平的學術論文廣泛發表在《數量經濟技術經濟研究》等頂刊上。整理了2000-2022年城市層面的鄉村振興指數與其30余個原始變量數據&#xff0c;供大家使用。 數據來源&…

react-spring,一個react的動畫庫的使用

介紹 React Spring 是一個 spring physics based animation library 用于 React。它可以輕松地在 React 中實現彈性、漸變等動畫效果。 使用 安裝依賴&#xff1a; 使用npm&#xff1a; npm install react-spring 使用yarn&#xff1a; yarn add react-spring 導入和使用&a…

Opencv4基于C++基礎入門筆記:OpenCV環境配置搭建

文章目錄&#xff1a; 一&#xff1a;軟件安裝 二&#xff1a;配置環境&#xff08;配置完之后重啟一下軟件&#xff09; 1.配置電腦系統環境變量 vs2012及其以下 vs2014及其以上 2.配置VS軟件環境變量 vs2012及其以下 vs2014及其以上 三&#xff1a;測試 vs2012及其…