DRF:覆盖通过视图发送到序列化程序的数据



我有一个接受两个对象的序列化程序,一旦用户进行身份验证,其中一个对象始终是常量。

当然,序列化程序不需要知道这些细节;它应该只知道它序列化和反序列化具有两个字段的对象。

此外,经过身份验证的用户只需通过视图集将他希望设置的值传递给非常量字段。

所以我需要的是一个钩子,它在序列化程序接收数据之前截获数据,将常量字段设置为用户的设置值,然后允许处理照常进行。

DRF 中有这样的钩子吗? 我见过的解决方案都非常笨拙:上下文(视图和序列化逻辑的耦合);验证(更多耦合);等等。 理论上我们想要的是:

data = union(userFields, fixedFieldsForView)
Serializer(data=data)

其中,data部分仅在视图中以某种方式处理。 另请注意,这只是在创建和更新对象期间,而不是读取(已经通过get_queryset过滤)。

如果问题是关于向序列化程序添加其他参数,那么是的:

  • 使用额外的参数保存灭菌器serializer.save(extra_arg=value, extra_arg2=value)
  • 覆盖视图的perform_createperform_update以调用serializer.save

我们采取了以下方法。 欢迎反馈。

def get_serializer(self, *args, **kwargs):
if self.request.method == 'POST' and 'data' in kwargs:
kwargs['data']['fixed_value'] = self.get_user_fixed_value()
return super(OurModel, self).get_serializer(*args, **kwargs)

因此,当用户 POST 到端点时,无论fixed_value的设置如何,该值都将始终正确设置。

仍然感觉有点黑客,但现在对我们有用。

相关内容

最新更新