> * 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),但在“安全验证外部数据并引入内部,以及将内部数据精美打包后输出外部”这一本质角色和结构上却惊人地相似。 ![Serializer 与 Form 的象征性图片](/media/whitedec/blog_img/bhqorJyY.webp) *** ## 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 尽管相似,但为何越用越让人感到不适的原因。 如果本文对您有所帮助,请点赞并期待我的下一篇文章!