为什么 Serializer 方法和 View 方法有区别?

Jor*_*dan 3 django django-rest-framework

在 Django DRF 中,我可以将以下方法添加到序列化器中:

    def create(self, validated_data):
        user = User(
            email=validated_data['email'],
            username=validated_data['username']
        )
        user.set_password(validated_data['password'])
        user.save()
        return user
Run Code Online (Sandbox Code Playgroud)

在发现这一点之前,我认为您通常通过重写 View/ViewSet 方法在视图中执行此操作。

我原以为序列化器所做的只是转换数据并将其发送出去或从外部调用接收它。

有人可以向我解释一下在视图上执行此操作与在序列化器上执行此操作之间的区别吗?

更广泛地说,在序列化器上调用方法而不是在其他地方调用方法有什么好处?

dec*_*eze 11

序列化器的工作是获取一个数据块并将其转换为另一块数据。最典型的是它从模型转换为某种形式的字典,反之亦然。通常,每个模型至少有一个序列化器,但对于不同的用例,您可以有任意数量的序列化器。例如,您可能会以不同的形式获取数据,例如从注册表单和 API 调用中获取数据,并且您希望将两者都转换为有效的实例User。因此,您可以为这两种不同的场景定义两个不同的序列化器,它们最终都会得到相同的User实例。您可能需要自定义这些序列化程序的某些方面以适应场合。

另一方面,视图接受 HTTP 请求,执行某些操作,然后决定返回什么响应。做某事可能涉及使用序列化器,并非必须如此。视图最重要的工作是决定当某件事成功或失败时要做什么,例如呈现不同的响应或重定向到不同的 URL。

您需要决定某些逻辑的可重用程度。将序列化器视为将一种数据类型转换为另一种数据类型;称之为将类型 A转换为类型 B,反之亦然。这里的“类型”是您的输入/输出数据的样子。然后考虑在应用程序中的哪个位置会遇到A 类型的数据 blob ,以及是否需要多次将其转换为B 类型。如果是这样,您可能希望为其创建一个特定的序列化器,而不是在两个或多个视图中重复相同的逻辑。