我有一个接受两个对象的序列化程序,其中一个对象在用户通过身份验证后始终保持不变。
当然,序列化器不需要知道这些细节;它应该只知道它使用两个字段序列化和反序列化一个对象。
此外,经过身份验证的用户只需通过视图集将他希望设置的值传递给非常量字段。
所以我需要的是一个钩子,它在序列化器接收数据之前拦截数据,将常量字段设置为用户的设置值,然后允许处理照常进行。
DRF中有这样的钩子吗?我见过的解决方案都非常hacky:上下文(视图和序列化逻辑的耦合);验证(更多耦合);等等。理论上我们想要的是:
data = union(userFields, fixedFieldsForView)
Serializer(data=data)
其中data
部分仅以某种方式在视图中处理。另请注意,这只是在创建和更新对象期间,而不是读取(已由get_queryset
过滤)。
答案 0 :(得分:1)
如果问题是关于向序列化器添加其他参数,那么是:
serializer.save(extra_arg=value, extra_arg2=value)
perform_create
和perform_update
以致电serializer.save
答案 1 :(得分:1)
我们采取了以下方法。欢迎反馈。
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
的设置如何,该值都将始终正确设置。
仍感觉有点像黑客,但现在对我们有用。