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