首页 > 解决方案 > 为什么 Serializer 方法和 View 方法有区别?

问题描述

在 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

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

我曾认为序列化程序所做的只是转换数据并将其发送出去或从外部调用中接收。

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

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

标签: djangodjango-rest-framework

解决方案


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

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

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


推荐阅读