Django RestFramework如何让字段允许发布但现在允许放置

时间:2016-03-03 00:59:40

标签: django django-rest-framework

我有一个序列化器:

class AreaSerializer(serializers.ModelSerializer):
    x_axis = serializers.FloatField()
    y_axis = serializers.FloatField()
    map_id = serializers.IntegerField(source='area_map_id')

我有ListCreateAPIViewRetrieveUpdateDestroyAPIView使用它 但我希望字段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

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