Django REST framework(DRF)在處理不同請求方法時的完整流程

文章目錄

  • 一、POST 請求創建對象的流程
  • 二、GET 請求獲取對象列表的流程
  • 三、GET 請求獲取單個對象的流程
  • 四、PUT/PATCH 請求更新對象的流程
  • 五、自定義方法的流程
    • 自定義 GET 方法
    • 自定義 POST 方法


一、POST 請求創建對象的流程

  1. 請求到達視圖層

    • 方法調用: dispatch
    • 說明: DRF 的視圖集接收到請求,dispatch 方法根據請求方法將請求分發到對應的處理方法(如 create)。
  2. 初始化請求

    • 方法調用: initial
    • 說明: 執行認證、權限檢查、限流等操作。
  3. 調用視圖的 create 方法

    • 方法調用: create
    • 說明: 根據請求,進入視圖集的 create 方法處理創建邏輯。
  4. 獲取序列化器并傳入數據

    • 方法調用: get_serializer(data=request.data)
    • 說明: 實例化序列化器,將請求數據傳入。
  5. 序列化器驗證數據

    • 方法調用: is_valid(raise_exception=True)
    • 過程:
      • to_internal_value: 將輸入數據轉換為內部 Python 表示。
      • 字段驗證: 對每個字段執行驗證,如類型、格式等。
      • 對象級驗證: 執行序列化器的 validate 方法,進行跨字段驗證。
  6. 保存數據(調用序列化器的 create 方法)

    • 方法調用: save()
      • 內部調用: create(validated_data)
    • 說明: 數據驗證通過后,調用 save 方法,進而調用序列化器的 create 方法,使用驗證后的數據創建對象。
  7. 返回響應

    • 方法調用: Response(serializer.data, status=201)
    • 過程:
      • to_representation: 將對象數據序列化為可返回的格式。
    • 說明: 視圖返回包含序列化數據的響應。

二、GET 請求獲取對象列表的流程

  1. 請求到達視圖層

    • 方法調用: dispatch
    • 說明: 請求被分發到視圖的 list 方法。
  2. 初始化請求

    • 方法調用: initial
    • 說明: 執行認證、權限檢查、限流等。
  3. 調用視圖的 list 方法

    • 方法調用: list
    • 說明: 處理獲取列表的邏輯。
  4. 獲取查詢集

    • 方法調用: get_queryset
    • 說明: 獲取需要展示的對象集合。
  5. 過濾查詢集

    • 方法調用: filter_queryset(queryset)
    • 說明: 根據過濾條件篩選數據。
  6. 分頁(如果設置了分頁器)

    • 方法調用: paginate_queryset(queryset)
    • 說明: 對查詢集進行分頁處理。
  7. 獲取序列化器并序列化數據

    • 方法調用: get_serializer(instance=queryset, many=True)
    • 過程:
      • to_representation: 遍歷查詢集,對每個對象進行序列化。
    • 說明: 將對象數據轉換為可返回的格式。
  8. 返回響應

    • 方法調用: Response(serializer.data)
    • 說明: 返回包含序列化數據的響應。

三、GET 請求獲取單個對象的流程

  1. 請求到達視圖層

    • 方法調用: dispatch
    • 說明: 請求被分發到視圖的 retrieve 方法。
  2. 初始化請求

    • 方法調用: initial
    • 說明: 執行認證、權限檢查、限流等。
  3. 調用視圖的 retrieve 方法

    • 方法調用: retrieve
    • 說明: 處理獲取對象詳情的邏輯。
  4. 獲取對象實例

    • 方法調用: get_object
      • 內部調用: get_queryset 和 filter_queryset
    • 說明: 根據 pk 或其他標識符獲取單個對象。
  5. 獲取序列化器并序列化數據

    • 方法調用: get_serializer(instance=object)
    • 過程:
      • to_representation: 將對象數據序列化。
    • 說明: 將對象轉換為可返回的格式。
  6. 返回響應

    • 方法調用: Response(serializer.data)
    • 說明: 返回包含對象數據的響應。

四、PUT/PATCH 請求更新對象的流程

  1. 請求到達視圖層

    • 方法調用: dispatch
  2. 初始化請求

    • 方法調用: initial
  3. 調用視圖的 update 方法

    • 方法調用: update(PUT)或 partial_update(PATCH)
  4. 獲取對象實例

    • 方法調用: get_object
  5. 獲取序列化器并傳入數據和實例

    • 方法調用: get_serializer(instance=object, data=request.data, partial=partial)
    • 說明: partial 參數決定是否允許部分更新。
  6. 序列化器驗證數據

    • 方法調用: is_valid(raise_exception=True)
  7. 保存數據(調用序列化器的 update 方法)

    • 方法調用: save()
    • 內部調用: update(instance, validated_data)
  8. 返回響應

    • 方法調用: Response(serializer.data)

五、自定義方法的流程

自定義 GET 方法

  1. 請求到達視圖層

    • 方法調用:dispatch
    • 說明:DRF 的視圖接收到請求,dispatch 方法根據請求方法和路由信息,將請求分發到對應的處理方法。
  2. 初始化請求

    • 方法調用:initial
    • 說明:進行認證、權限檢查和限流等操作。
  3. 調用自定義方法

    • 方法調用:custom_get
    • 說明:執行自定義的邏輯。由于這是一個 GET 請求,通常不會涉及數據的修改或序列化器的使用。
  4. 返回響應

    • 方法調用:Response
    • 說明:將處理結果封裝在 Response 對象中,返回給客戶端。

注意:在這個過程中,不會涉及序列化器的方法調用,除非您在自定義方法中主動使用序列化器。

自定義 POST 方法

  1. 請求到達視圖層

    • 方法調用:dispatch
  2. 初始化請求

    • 方法調用:initial
  3. 調用自定義方法

    • 方法調用:custom_post
  4. 獲取序列化器并傳入數據

    • 方法調用:get_serializer(data=request.data)
    • 說明:實例化序列化器,用于數據驗證和保存。
  5. 序列化器驗證數據

    • 方法調用:is_valid(raise_exception=True)
    • 過程:
      • to_internal_value:將輸入的數據轉換為內部 Python 數據類型。
      • 字段驗證:驗證各個字段的有效性。
      • validate 方法:執行對象級別的驗證。
  6. 保存數據

    • 方法調用:perform_create(serializer)

      • 內部調用:serializer.save()
    • 說明:調用序列化器的 save 方法,進而調用 create 方法,將數據保存到數據庫。

  7. 序列化器保存數據

    • 方法調用:create(validated_data)
    • 說明:使用經過驗證的數據創建新的對象實例。
  8. 返回響應

    • 方法調用:Response(serializer.data, status=201)
    • 過程:
      • to_representation:將創建的對象實例序列化為可 JSON 化的數據。
    • 說明:將創建的對象數據返回給客戶端。

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

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

相關文章

機器視覺與OpenCV--01篇

計算機眼中的圖像 像素 像素是圖像的基本單位,每個像素存儲著圖像的顏色、亮度或者其他特征,一張圖片就是由若干個像素組成的。 RGB 在計算機中,RGB三種顏色被稱為RGB三通道,且每個通道的取值都是0到255之間。 計算機中圖像的…

qemu源碼解析【03】qom實例

目錄 qemu源碼解析【03】qom實例arm_sbcon_i2c實例 qemu源碼解析【03】qom實例 arm_sbcon_i2c實例 以hw/i2c/arm_sbcon_i2c.c代碼為例,這個實例很簡單,只用100行左右的代碼,調用qemu系統接口實現了一個i2c硬件模擬先看include/hw/i2c/arm_s…

小程序自定義tab-bar,踩坑記錄

從官方下載代碼 https://developers.weixin.qq.com/miniprogram/dev/framework/ability/custom-tabbar.html 1、把custom-tab-bar 文件放置 pages同級 修改下 custom-tab-bar 下的 JS文件 Component({data: {selected: 0,color: "#7A7E83",selectedColor: "#3…

操作系統(14)請求分頁

前言 操作系統中的請求分頁,也稱為頁式虛擬存儲管理,是建立在基本分頁基礎上,為了支持虛擬存儲器功能而增加了請求調頁功能和頁面置換功能的一種內存管理技術。 一、基本概念 分頁:將進程的邏輯地址空間分成若干個大小相等的頁&am…

git企業開發的相關理論(一)

目錄 一.初識git 二.git的安裝 三.初始化/創建本地倉庫 四.配置用戶設置/配置本地倉庫 五.認識工作區、暫存區、版本庫 六.添加文件__場景一 七.查看 .git 文件/添加到本地倉庫后.git中發生的變化 1.執行git add后的變化 index文件(暫存區) log…

wxpython圖形用戶界面編程

wxpython圖形用戶界面編程 一、wxpython的基礎 1.1 wxpython的基礎 作為圖形用戶界面開發工具包 wxPython,主要提供了如下 GUI 內容: 窗口。控件。事件處理。布局管理。 1.2 wxpython的類層次機構 1.3 wxpython的安裝 Windows 和 macOS 平臺安裝&a…

水仙花數(流程圖,NS流程圖)

題目:打印出所有的100-999之間的"水仙花數",并畫出流程圖和NS流程圖。所謂"水仙花數"是指一個三位數,其各位數字立方和等于該數本身。例如:153是一個"水仙花數",因為1531的三次方&#…

不配置python環境,直接用PyCharm就可以?

有的伙伴可能遇到不安裝python環境只安裝pycharm也可以進行運行代碼。 所以自認為是不需要解釋器就可以運行? 這個是不現實的,有很多伙伴可能是安裝了Pycharm,但Pycharm看你電腦上沒有解釋器,所以在安裝的時候給你默認安裝在C盤…

網絡安全滲透測試概論

滲透測試,也稱為滲透攻擊測試是一種通過模擬惡意攻擊者的手段來評估計算機系統、網絡或應用程序安全性的方法。 目的 旨在主動發現系統中可能存在的安全漏洞、脆弱點以及潛在風險,以便在被真正的惡意攻擊者利用之前,及時進行修復和加固&…

爬蟲數據能用于商業嗎?

在當今數字化時代,數據已成為企業獲取競爭優勢的關鍵資源。網絡爬蟲作為一種數據收集工具,能夠從互聯網上抓取大量數據,這些數據在商業分析中扮演著重要角色。然而,使用爬蟲技術獲取的數據是否合法、能否用于商業分析,…

前端面試匯總(不定時更新)

目錄 HTML & CSS1. XML、HTML、XHTML 有什么區別??2. XML和JSON的區別?3. 是否了解W3C的規范??4. 什么是語義化標簽???5. 行內元素和塊級元素的區別??6. 行內元素和塊級元素的轉換??7. 常用的塊級…

SpringCloud微服務實戰系列:03spring-cloud-gateway業務網關灰度發布

目錄 spring-cloud-gateway 和zuul spring webflux 和 spring mvc spring-cloud-gateway 的兩種模式 spring-cloud-gateway server 模式下配置說明 grayLb://system-server 灰度發布代碼實現 spring-cloud-gateway 和zuul zuul 是spring全家桶的第一代網關組件&#x…

QT3學習之進階理解信號和槽:如何自定義一個類信號,供其它類調用槽函數

下面是QWidget源碼,定義了兩個事件 /*!This event handler can be reimplemented in a subclass to receivewidget enter events.An event is sent to the widget when the mouse cursor enters thewidget.\sa leaveEvent(), mouseMoveEvent(), event() */void QWi…

GaLore和Q-GaLore:一種記憶高效的預訓練和微調策略,用于大型語言模型(LLMs)

GaLore和Q-GaLore:一種記憶高效的預訓練和微調策略,用于大型語言模型(LLMs) GaLore和Q-GaLore的設計背景、工作原理及其優勢 設計背景 隨著大型語言模型(LLMs)的發展,模型的規模和復雜性不斷…

【網絡云計算】2024第51周-每日【2024/12/17】小測-理論-解析

文章目錄 1. 計算機網絡有哪些分類2. 計算機網絡中協議與標準的區別3. 計算機網絡拓撲有哪些結構4. 常用的網絡設備有哪些,分屬于OSI的哪一層5. IEEE802局域網標準有哪些 【網絡云計算】2024第51周-每日【2024/12/17】小測-理論-解析 1. 計算機網絡有哪些分類 計算…

ActiveMQ 反序列化漏洞CVE-2015-5254復現

文章目錄 一、產生原因二、利用條件三、利用過程四、PoC(概念驗證)五、poc環境驗證使用find搜索vulhub已安裝目錄打開activeMQ組件查看配置文件端口啟動鏡像-文件配置好后對于Docker 鏡像下載問題及解決辦法設置好鏡像源地址,進行重啟docker查…

shardingsphere分庫分表跨庫訪問 添加分片規則

shardingsphere分庫分表跨庫訪問 添加分片規則 建立 JDBC 環境 創建表 t_order: CREATE TABLE t_order (tid bigint(20) NOT NULL,tname varchar(255) DEFAULT NULL,goods_id bigint(20) DEFAULT NULL,tstatus varchar(255) DEFAULT NULL,PRIMARY KEY (tid) ) E…

C++ 中,構造函數、拷貝構造函數和移動構造函數區別

在 C 中,構造函數、拷貝構造函數和移動構造函數是類中用于對象初始化的三種不同類型的構造函數。它們的功能和使用場景有所不同,下面詳細解釋它們之間的區別。 1. 構造函數 (Constructor) 定義: 構造函數是一個特殊的成員函數,用…

MYSQL執行一條update語句,期間發生了什么

客戶端先通過連接器建立連接,連接器自會判斷用戶身份; 因為這是一條 update 語句,所以不需要經過查詢緩存,但是表上有更新語句,是會把整個表的查詢緩存清空的,所以說查詢緩存很雞肋,在 MySQL 8…

vue3監聽橫向滾動條的位置;鼠標滾輪滑動控制滾動條滾動;監聽滾動條到頂端

1.橫向取值scrollLeft 豎向取值scrollTop 2.可以監聽到最左最右側 3.鼠標滾輪滑動控制滾動條滾動 效果 <template><div><div class"scrollable" ref"scrollableRef"><!-- 內容 --><div style"width: 2000px; height: 100…