文章目錄
- 一、POST 請求創建對象的流程
- 二、GET 請求獲取對象列表的流程
- 三、GET 請求獲取單個對象的流程
- 四、PUT/PATCH 請求更新對象的流程
- 五、自定義方法的流程
- 自定義 GET 方法
- 自定義 POST 方法
一、POST 請求創建對象的流程
-
請求到達視圖層
- 方法調用: dispatch
- 說明: DRF 的視圖集接收到請求,dispatch 方法根據請求方法將請求分發到對應的處理方法(如 create)。
-
初始化請求
- 方法調用: initial
- 說明: 執行認證、權限檢查、限流等操作。
-
調用視圖的 create 方法
- 方法調用: create
- 說明: 根據請求,進入視圖集的 create 方法處理創建邏輯。
-
獲取序列化器并傳入數據
- 方法調用: get_serializer(data=request.data)
- 說明: 實例化序列化器,將請求數據傳入。
-
序列化器驗證數據
- 方法調用: is_valid(raise_exception=True)
- 過程:
- to_internal_value: 將輸入數據轉換為內部 Python 表示。
- 字段驗證: 對每個字段執行驗證,如類型、格式等。
- 對象級驗證: 執行序列化器的 validate 方法,進行跨字段驗證。
-
保存數據(調用序列化器的 create 方法)
- 方法調用: save()
- 內部調用: create(validated_data)
- 說明: 數據驗證通過后,調用 save 方法,進而調用序列化器的 create 方法,使用驗證后的數據創建對象。
- 方法調用: save()
-
返回響應
- 方法調用: Response(serializer.data, status=201)
- 過程:
- to_representation: 將對象數據序列化為可返回的格式。
- 說明: 視圖返回包含序列化數據的響應。
二、GET 請求獲取對象列表的流程
-
請求到達視圖層
- 方法調用: dispatch
- 說明: 請求被分發到視圖的 list 方法。
-
初始化請求
- 方法調用: initial
- 說明: 執行認證、權限檢查、限流等。
-
調用視圖的 list 方法
- 方法調用: list
- 說明: 處理獲取列表的邏輯。
-
獲取查詢集
- 方法調用: get_queryset
- 說明: 獲取需要展示的對象集合。
-
過濾查詢集
- 方法調用: filter_queryset(queryset)
- 說明: 根據過濾條件篩選數據。
-
分頁(如果設置了分頁器)
- 方法調用: paginate_queryset(queryset)
- 說明: 對查詢集進行分頁處理。
-
獲取序列化器并序列化數據
- 方法調用: get_serializer(instance=queryset, many=True)
- 過程:
- to_representation: 遍歷查詢集,對每個對象進行序列化。
- 說明: 將對象數據轉換為可返回的格式。
-
返回響應
- 方法調用: Response(serializer.data)
- 說明: 返回包含序列化數據的響應。
三、GET 請求獲取單個對象的流程
-
請求到達視圖層
- 方法調用: dispatch
- 說明: 請求被分發到視圖的 retrieve 方法。
-
初始化請求
- 方法調用: initial
- 說明: 執行認證、權限檢查、限流等。
-
調用視圖的 retrieve 方法
- 方法調用: retrieve
- 說明: 處理獲取對象詳情的邏輯。
-
獲取對象實例
- 方法調用: get_object
- 內部調用: get_queryset 和 filter_queryset
- 說明: 根據 pk 或其他標識符獲取單個對象。
- 方法調用: get_object
-
獲取序列化器并序列化數據
- 方法調用: get_serializer(instance=object)
- 過程:
- to_representation: 將對象數據序列化。
- 說明: 將對象轉換為可返回的格式。
-
返回響應
- 方法調用: Response(serializer.data)
- 說明: 返回包含對象數據的響應。
四、PUT/PATCH 請求更新對象的流程
-
請求到達視圖層
- 方法調用: dispatch
-
初始化請求
- 方法調用: initial
-
調用視圖的 update 方法
- 方法調用: update(PUT)或 partial_update(PATCH)
-
獲取對象實例
- 方法調用: get_object
-
獲取序列化器并傳入數據和實例
- 方法調用: get_serializer(instance=object, data=request.data, partial=partial)
- 說明: partial 參數決定是否允許部分更新。
-
序列化器驗證數據
- 方法調用: is_valid(raise_exception=True)
-
保存數據(調用序列化器的 update 方法)
- 方法調用: save()
- 內部調用: update(instance, validated_data)
-
返回響應
- 方法調用: Response(serializer.data)
五、自定義方法的流程
自定義 GET 方法
-
請求到達視圖層
- 方法調用:dispatch
- 說明:DRF 的視圖接收到請求,dispatch 方法根據請求方法和路由信息,將請求分發到對應的處理方法。
-
初始化請求
- 方法調用:initial
- 說明:進行認證、權限檢查和限流等操作。
-
調用自定義方法
- 方法調用:custom_get
- 說明:執行自定義的邏輯。由于這是一個 GET 請求,通常不會涉及數據的修改或序列化器的使用。
-
返回響應
- 方法調用:Response
- 說明:將處理結果封裝在 Response 對象中,返回給客戶端。
注意:在這個過程中,不會涉及序列化器的方法調用,除非您在自定義方法中主動使用序列化器。
自定義 POST 方法
-
請求到達視圖層
- 方法調用:dispatch
-
初始化請求
- 方法調用:initial
-
調用自定義方法
- 方法調用:custom_post
-
獲取序列化器并傳入數據
- 方法調用:get_serializer(data=request.data)
- 說明:實例化序列化器,用于數據驗證和保存。
-
序列化器驗證數據
- 方法調用:is_valid(raise_exception=True)
- 過程:
- to_internal_value:將輸入的數據轉換為內部 Python 數據類型。
- 字段驗證:驗證各個字段的有效性。
- validate 方法:執行對象級別的驗證。
-
保存數據
-
方法調用:perform_create(serializer)
- 內部調用:serializer.save()
-
說明:調用序列化器的 save 方法,進而調用 create 方法,將數據保存到數據庫。
-
-
序列化器保存數據
- 方法調用:create(validated_data)
- 說明:使用經過驗證的數據創建新的對象實例。
-
返回響應
- 方法調用:Response(serializer.data, status=201)
- 過程:
- to_representation:將創建的對象實例序列化為可 JSON 化的數據。
- 說明:將創建的對象數據返回給客戶端。