• Django Form 是一個用於驗證 HTML 輸入數據的工具。
  • DRF Serializer 是一個用於驗證和轉換 JSON API 數據的工具。
  • 這兩種工具在 is_valid()、驗證數據和錯誤處理流程上都非常相似。
  • ModelForm 和 ModelSerializer 在基於模型的自動欄位生成和儲存結構上也十分相似。

Django Form 與 DRF Serializer 的相似之處

在使用 Django 時,有兩位重要的守門員一直守護著我們(有時也讓我們頭疼不已),它們就是 Django FormDRF(Django REST Framework) Serializer。在這裡,我們將整理兩者之間的相似之處。

這兩位「朋友」雖然活躍的舞台不同(網頁 vs. API),但其核心職責和結構卻驚人地相似:都是「安全地驗證外部數據並引入內部,再將內部數據精美包裝後輸出到外部」。

Serializer 與 Form 的象徵性圖像


1. 角色一覽:快速比較

簡單來說,它們就像百貨公司入口處的「安全人員兼接待員」。

  • Django Form: 主要活躍於 HTML 網頁 的世界。它會檢查使用者在瀏覽器視窗中輸入的數據(Form Data)是否正確,如果出現錯誤,就會友善地在畫面上提示「請重新輸入」。
  • DRF Serializer: 主要活躍於傳輸 JSONAPI 世界。它將行動應用程式或前端(如 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) 與數據存取方式完全相同

檢查數據安全性並存取已驗證數據的方法流程是完全一致的。

  1. 有效性檢查: 這兩種方式都是在輸入數據後,呼叫 if form.is_valid():if serializer.is_valid():
  2. 存取已通過數據: 經過驗證的乾淨數據,在 Form 中會儲存在 form.cleaned_data 這個字典裡,而在 Serializer 中則儲存在 serializer.validated_data。兩者名稱略有不同,但功能相同。
  3. 錯誤確認: 如果驗證失敗,則可以透過 form.errorsserializer.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 雖然相似,但為何在使用時會讓人感到不舒服的原因。

如果這篇文章對您有所幫助,請點擊喜歡!並期待我的下一篇文章。