- 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 尽管相似,但为何越用越让人感到不适的原因。
如果本文对您有所帮助,请点赞并期待我的下一篇文章!