序列化方法和视图方法有什么区别?

3
在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方法来完成此操作。

我曾认为序列化器的全部作用就是将数据转换并发送到外部调用或从外部接收数据。

有人可以向我解释在视图和序列化器中完成此操作的区别吗?

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

1个回答

10
序列化器的作用是将一个数据块转换为另一个数据块。通常情况下,它将从模型转换为某种字典形式,反之亦然。通常每个模型都至少有一个序列化器,但你可能会有多个序列化器用于不同的用例。例如,你可能会以不同的形式获取数据,例如从注册表单和API调用中,你希望将这两种数据都转换为有效的"User"实例。因此,你可以为这两种不同的情况定义两个不同的序列化器,它们最终都得到相同的"User"实例。你可能需要定制一些序列化器的方面来适应各种场合。
另一方面,视图接收HTTP请求,执行一些操作,然后决定返回什么响应。这些操作可能涉及使用序列化器,但并非必须。视图的最大作用是在成功或失败时决定如何处理,例如呈现不同的响应或重定向到不同的URL。
你需要决定某个逻辑块的可重用程度。把序列化器视为将一种数据类型转换为另一种类型的工具;称其为将"类型A"转换为"类型B",反之亦然。这里的"类型"指的是你的输入/输出数据的确切外观。然后考虑你在应用程序中将遇到哪些"类型A"的数据块以及是否需要将其转换为"类型B"超过一次。如果是这样,你可能需要为它制定一个特定的序列化器,而不是在两个或多个视图内重复相同的逻辑。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接