DRF尝试更新只读字段

时间:2019-09-10 22:06:29

标签: django python-3.x django-rest-framework

我有一个Django模型(源自CleanerVersion Versionable模型),正在使用DRF进行序列化,并且我希望将几个字段设置为只读(它们由一系列函数创建,因此被设置为属性),但是当我尝试更新记录,只读字段包含在validated_data中,并且还包含在在update()期间设置属性和值的过程中。

我的模型。py

class Athlete(Versionable):
    ...
    @property
    def photo_status(self):
        if(self.photo!=None):
            return True
        return False
    ...

对于我的serializer.py,我尝试了不同的方法: 将序列化器字段设置为只读

class AthleteSerializerSerializer(serializers.ModelSerializer)::
    ...
    photo_status= serializers.BooleanField(read_only=True)
    ...
    class Meta:
        model = Athlete
        fields = '__all__'
    ...

不包括字段

class AthleteSerializer(serializers.ModelSerializer)::
    ...
    class Meta:
        model = Athlete
        exclude = ['photo_status']
    ...

添加了额外的矮人

class AthleteSerializerSerializer(serializers.ModelSerializer)::
    ...
    class Meta:
        model = Athlete
        fields='__all__'
        extra_kwargs = {
            'photo_status': {'read_only': True},
        }
    ...

无论如何,什么时候运行:

serializer = AthleteSerializer(Athlete.objects.current.get(identity=a.identity),data=request.data.get("athlete"))
serializer.is_valid()
serializer.save()

我收到以下错误消息

setattr(instance, attr, value)
AttributeError: can't set attribute

我将几个不同的属性设置为只读,并设置了几个字段(例如CleanerVersion自动更新id和identity字段,因此更新程序不应该触摸它们),它们都存在于validated_data中,据我从GitHub上的代码可以看出,属性名称是从哪里获取的。我尝试从更新功能复制代码, 这基本上就是我在更新中所说的:

def update(self, instance, validated_data):
        instance = instance.clone()
        return super().update(instance, validated_data)

如果我对其进行调试,它将在我尝试排除的第一个字段上失败

我在做什么错?如何在更新/创建时告诉DRF忽略某些字段?

0 个答案:

没有答案