- 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 標籤 (<input>) |
Python 物件 -> 轉換為 JSON 字串 (序列化) |
2. 為何如此相似?三大結構性相似之處
DRF 的開發者也認為 Django Form 的結構非常出色,因此幾乎是直接借鑒其設計來創建 Serializer。這使得兩者的程式碼結構和使用方式就像異卵雙胞胎一樣相似。
① 欄位定義方式完全相同
指定數據格式的方式簡直一模一樣。
- Django Form:
from django import forms
class UserForm(forms.Form):
username = forms.CharField(max_length=100)
email = forms.EmailField()
age = forms.IntegerField()
- DRF Serializer:
from rest_framework import serializers
class UserSerializer(serializers.Serializer):
username = serializers.CharField(max_length=100)
email = serializers.EmailField()
age = serializers.IntegerField()
除了
forms變成serializers之外,宣告欄位的邏輯完全相同。
② 驗證 (Validation) 與數據存取方式完全相同
檢查數據安全性並存取已驗證數據的方法流程是完全一致的。
- 有效性檢查: 這兩種方式都是在輸入數據後,呼叫
if form.is_valid():或if serializer.is_valid():。 - 存取已通過數據: 經過驗證的乾淨數據,在 Form 中會儲存在
form.cleaned_data這個字典裡,而在 Serializer 中則儲存在serializer.validated_data。兩者名稱略有不同,但功能相同。 - 錯誤確認: 如果驗證失敗,則可以透過
form.errors或serializer.errors獲取以字典形式呈現的錯誤訊息,查看哪裡出了問題。
③ 與 Model 的整合 (ModelForm vs ModelSerializer)
Django 的核心是與資料庫 (Model) 整合。這兩種工具都擁有一個「作弊碼」般的類別,可以根據模型自動生成欄位。
- Django ModelForm:
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['title', 'content']
- DRF ModelSerializer:
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 雖然相似,但為何在使用時會讓人感到不舒服的原因。
如果這篇文章對您有所幫助,請點擊喜歡!並期待我的下一篇文章。