为什么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方法来实现这一点。

我曾认为Serializer所做的只是转换数据,并从外部调用发送或接收数据。

有人能向我解释一下在视图上这样做和在序列化程序上这样做的区别吗?

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

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

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

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

相关内容

最新更新