使用django rest框架在验证步骤之前修改数据

时间:2015-08-03 17:52:58

标签: django django-rest-framework

我有一个简单的Model,用ForeignKey存储创建它的用户。该模型具有相应的ModelSerializerModelViewSet

问题是当用户提交POST来创建新记录时,后端应设置user。我试图在perform_create上覆盖ModelViewSet来设置用户,但在验证步骤中它实际上仍然失败(这是有道理的)。它回来说需要user字段。

我正在考虑覆盖user上的ModelSerializer字段是可选的,但我觉得这可能是一种更干净,更有效的方法。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

我在寻找一种在控制进入验证器之前更新值的方法时遇到了这个答案。

这可能对其他人有用 - 这就是我最终如何做到这一点(DRF 3)而不重写整个验证器。

class MyModelSerializer(serializers.ModelSerializer):
    def to_internal_value(self, data):
        data['user'] = '<Set Value Here>'

        return super(MyModelSerializer, self).to_internal_value(data)

对于那些好奇的人,我用它来将十进制值舍入到模型中定义的精度,这样验证器就不会抛出错误。

答案 1 :(得分:1)

老话题,但它可能对某人有用。

如果您想在验证序列化程序之前更改数据:

serializer.initial_data["your_key"] = "your data"
serializer.is_valid(raise_exception=True)

答案 2 :(得分:0)

您可以将user字段设为read_only.

这将确保在序列化表示时使用该字段,但在反序列化期间创建或更新实例时不使用该字段。

在序列化程序中,您可以执行以下操作:

class MyModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = MyModel
        extra_kwargs = {
            'user' : {'read_only' : True} # define the 'user' field as 'read-only'
        }

然后,您可以覆盖perform_create()并根据您的要求设置user