我有一个序列化器:
class AreaSerializer(serializers.ModelSerializer):
x_axis = serializers.FloatField()
y_axis = serializers.FloatField()
map_id = serializers.IntegerField(source='area_map_id')
我有ListCreateAPIView
和RetrieveUpdateDestroyAPIView
使用它
但我希望字段map_id
可以允许POST方法,不允许PUT方法
我的意思是如果POST下面的数据没问题
{
"x_axis":1,
"y_axis":2,
"map_id":1
}
如果PUT,下面的数据仍然正常
{
"x_axis":1,
"y_axis":2,
"map_id":1
}
但map_id
不会对数据库产生影响
如果数据库使用map_id = 2保存,它仍然是2,它将不会被编辑为1
答案 0 :(得分:1)
您可以创建另一个序列化程序AreaPutSerializer
,它将继承AreaSerializer
以处理PUT
个请求。
在AreaPutSerializer
中,我们会使用map_id
选项将read_only
字段设置为extra_kwargs
。这样做可确保在PUT
个请求中,map_id
字段将包含在API输出中,但不会用于写入操作。
class AreaSerializer(serializers.ModelSerializer):
x_axis = serializers.FloatField()
y_axis = serializers.FloatField()
map_id = serializers.IntegerField(source='area_map_id')
class AreaPutSerializer(AreaSerializer):
class Meta(AreaSerializer.Meta):
extra_kwargs = {'map_id': {'read_only':True}}
在您的视图中,您可以添加get_serializer_class
方法,该方法将根据请求方法返回要使用的序列化程序类。
def get_serializer_class(self):
if self.request.method == 'PUT':
return AreaPutSerializer
return AreaSerializer