使用Django Rest框架在验证步骤之前修改数据

Luk*_*pan 1 django django-rest-framework

我有一个简单的文件Model,用于存储使用创建它的用户ForeignKey。该模型有一个对应的ModelSerializerModelViewSet

问题在于,当用户提交POST创建新记录时,user应该由后端设置。我试图压倒一切perform_createModelViewSet设置用户,但它实际上在验证步骤仍然失败(这是有道理的)。回来说user必须填写该字段。

我正在考虑将user字段覆盖ModelSerializer为可选字段,但我觉得可能存在更清洁,更有效的方法。有任何想法吗?

Rah*_*pta 7

您可以将该user字段设置为read_only.

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

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

class MyModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = MyModel
        extra_kwargs = {
            'user' : {'read_only' : True} # define the 'user' field as 'read-only'
        }
Run Code Online (Sandbox Code Playgroud)

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


San*_*eem 7

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

这可能对其他人很有用-这是我最终如何做(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)
Run Code Online (Sandbox Code Playgroud)

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

  • 使用这个给了我异常```AttributeError:这个QueryDict实例是不可变的``` (2认同)