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

Django rest framework DRF:覆盖通过视图发送到序列化程序的数据,django-rest-framework,Django Rest Framework,我有一个序列化程序,它接受两个对象,一旦用户进行了身份验证,其中一个对象总是常量 当然,序列化程序不需要知道这些细节;它应该只知道它用两个字段序列化和反序列化一个对象 此外,经过身份验证的用户只需通过viewset将希望设置的值传递给非常量字段 所以我需要的是一个钩子,它在序列化程序接收数据之前拦截数据,将常量字段设置为用户的设置值,然后允许处理照常进行 DRF中有这样的钩子吗?我看到的解决方案都非常粗糙:上下文(视图和序列化逻辑的耦合);验证(更多耦合);等等理论上,我们想要的是: data

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

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

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

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

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

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

其中,
数据
部分仅在视图中处理。另请注意,这仅在创建和更新对象期间进行,而不是读取(已通过
get\u queryset
进行筛选)。

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

  • 用额外的参数保存消毒器
    serializer.save(extra_arg=value,extra_arg2=value)
  • 覆盖视图的
    perform\u create
    perform\u update
    调用
    序列化程序。保存

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

  • 用额外的参数保存消毒器
    serializer.save(extra_arg=value,extra_arg2=value)
  • 覆盖视图的
    perform\u create
    perform\u update
    调用
    序列化程序。保存

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

      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)
      
      因此,当用户发布到端点时,无论
      fixed_value
      的设置如何,该值都将始终正确设置


      感觉还是有点像黑客,但现在对我们有效。

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

      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)
      
      因此,当用户发布到端点时,无论
      fixed_value
      的设置如何,该值都将始终正确设置

      仍然感觉有点像黑客,但现在对我们有效