> * Django Form 是一個用於驗證 HTML 輸入數據的工具。
> * DRF Serializer 是一個用於驗證和轉換 JSON API 數據的工具。
> * 這兩種工具在 `is_valid()`、驗證數據和錯誤處理流程上都非常相似。
> * ModelForm 和 ModelSerializer 在基於模型的自動欄位生成和儲存結構上也十分相似。
***
## Django Form 與 DRF Serializer 的相似之處
在使用 [[Django]] 時,有兩位重要的守門員一直守護著我們(有時也讓我們頭疼不已),它們就是 [[Django Form]] 和 **DRF([[Django REST Framework]]) Serializer**。在這裡,我們將整理兩者之間的相似之處。
這兩位「朋友」雖然活躍的舞台不同(網頁 vs. API),但其核心職責和結構卻驚人地相似:都是「安全地驗證外部數據並引入內部,再將內部數據精美包裝後輸出到外部」。

***
## 1\. 角色一覽:快速比較
簡單來說,它們就像百貨公司入口處的「安全人員兼接待員」。
* **Django Form:** 主要活躍於 **HTML 網頁** 的世界。它會檢查使用者在瀏覽器視窗中輸入的數據(Form Data)是否正確,如果出現錯誤,就會友善地在畫面上提示「請重新輸入」。
* **DRF Serializer:** 主要活躍於傳輸 **JSON** 的 **API** 世界。它將行動應用程式或前端(如 React、Vue 等)發送的 JSON 數據轉換為 Python 物件,反之亦然,將資料庫中的數據精美地包裝(序列化)成 JSON。
| 功能 | Django Form (以網頁為中心) | DRF Serializer (以 API 為中心) |
| --- | ---------------------- | ----------------------- |
| **輸入時 (Input)** | HTML Form -> Python 字典 (`cleaned_data`) | JSON 字串 -> Python 字典 (`validated_data`) |
| **數據驗證** | 呼叫 `is_valid()` | 呼叫 `is_valid()` |
| **輸出時 (Output)** | Python 物件 -> 渲染為 HTML 標籤 (``) | Python 物件 -> 轉換為 JSON 字串 (序列化) |
***
## 2\. 為何如此相似?三大結構性相似之處
DRF 的開發者也認為 Django Form 的結構非常出色,因此幾乎是直接借鑒其設計來創建 Serializer。這使得兩者的程式碼結構和使用方式就像異卵雙胞胎一樣相似。
### ① 欄位定義方式完全相同
指定數據格式的方式簡直一模一樣。
* **Django Form:**
```python
from django import forms
class UserForm(forms.Form):
username = forms.CharField(max_length=100)
email = forms.EmailField()
age = forms.IntegerField()
```
* **DRF Serializer:**
```python
from rest_framework import serializers
class UserSerializer(serializers.Serializer):
username = serializers.CharField(max_length=100)
email = serializers.EmailField()
age = serializers.IntegerField()
```
> 除了 `forms` 變成 `serializers` 之外,宣告欄位的邏輯完全相同。
### ② 驗證 (Validation) 與數據存取方式完全相同
檢查數據安全性並存取已驗證數據的方法流程是完全一致的。
1. **有效性檢查:** 這兩種方式都是在輸入數據後,呼叫 `if form.is_valid():` 或 `if serializer.is_valid():`。
2. **存取已通過數據:** 經過驗證的乾淨數據,在 Form 中會儲存在 `form.cleaned_data` 這個字典裡,而在 Serializer 中則儲存在 `serializer.validated_data`。兩者名稱略有不同,但功能相同。
3. **錯誤確認:** 如果驗證失敗,則可以透過 `form.errors` 或 `serializer.errors` 獲取以字典形式呈現的錯誤訊息,查看哪裡出了問題。
### ③ 與 Model 的整合 (ModelForm vs ModelSerializer)
Django 的核心是與資料庫 (Model) 整合。這兩種工具都擁有一個「作弊碼」般的類別,可以根據模型自動生成欄位。
* **Django ModelForm:**
```python
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['title', 'content']
```
* **DRF ModelSerializer:**
```python
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ['title', 'content']
```
> 連使用內部 `Meta` 類別來指定基於哪個模型、使用哪些欄位的語法都驚人地相似。正因為如此,呼叫 `save()` 方法時,數據會自動在資料庫中創建 (`create`) 或修改 (`update`),這一點也是相同的。
***
## 總結
* **Django Form** 扮演著 **HTML 與 Python 之間** 的翻譯角色,同時負責數據驗證;
* **DRF Serializer** 則扮演著 **JSON 與 Python 之間** 的翻譯角色,同時負責數據驗證。
如果您曾經使用過 Django Form,那麼您可以將 DRF Serializer 理解為「哦,它就是處理 JSON 而不是 HTML 的 Form 嘛!」這樣想,大概有 90% 以上是正確的。反之,如果您先接觸了 Serializer,那麼 Form 也會很容易理解。
然而,我相信許多後端工程師會發現,這兩種工具雖然非常相似,但他們對 Serializer 感到自在,卻對作為 Serializer 基礎的 Form 感到有些不適。我也是如此。
您是否曾仔細思考過為何會有這種感覺呢?在下一篇文章中,我將探討 Django Form 和 Serializer 雖然相似,但為何在使用時會讓人感到不舒服的原因。
如果這篇文章對您有所幫助,請點擊喜歡!並期待我的下一篇文章。