【问题标题】:DRF CurrentUserDefault in serializer.update with PATCH request带有 PATCH 请求的 serializer.update 中的 DRF CurrentUserDefault
【发布时间】:2018-10-19 13:42:07
【问题描述】:

鉴于PATCH 请求下方的序列化程序与{'description': 'product_3'} 不包括user 在验证数据中。

如何在不调用.save(updated_by=request.user) 的情况下将CurrentUserDefault() 添加到经过验证的数据中?

class MySerializer(serializer.ModelSerializer):
    user = serializers.HiddenField(default=serializers.CurrentUserDefault())

    class Meta:
        model = Model
        fields = ('id', 'user', 'description')

    def create(self, validated_data):
        validated_data['created_by'] = validated_data.pop('user')
        return super().create(validated_data)

    def update(self, instance, validated_data):
        validated_data['updated_by'] = validated_data.pop('user')
        return super().create(instance, validated_data)

【问题讨论】:

  • 我认为您的代码中存在安全问题,因为我认为您从请求中获取当前用户(用户可以简单地更改表单并像其他用户一样提交数据)请注意当前用户已经在 self.context['request'].user您不需要从用户提交的数据中获取它
  • 我刚刚测试了它,即使用户提交了带有user 的请求,它也会被忽略并且对象与真正的当前用户一起保存。

标签: django django-rest-framework


【解决方案1】:

CurrentUserDefault()

def update(self, instance, validated_data):
    user = validated_data.pop('user', None)
    validated_data['updated_by'] = user if user else self.context['request'].user
    return super().update(instance, validated_data)

【讨论】:

  • 在修补主记录时创建新的子记录时,您也可以使用嵌套序列化程序解决此问题。上述方案有效,或者如果你也直接使用你的子序列化器,你可以将类似的代码添加到父序列化器的update
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 2016-03-23
  • 2020-04-13
  • 2015-03-10
  • 1970-01-01
  • 2014-12-21
相关资源
最近更新 更多