我有一个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忽略某些字段?