• 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:主要在以 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) 和数据访问方式相同

检查数据是否安全以及访问已验证数据的方法流程是一致的。

  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 尽管相似,但为何越用越让人感到不适的原因。

如果本文对您有所帮助,请点赞并期待我的下一篇文章!