如何将非模型字段添加到DRF的序列化器响应字典?

pnh*_*gde 1 python api django serialization django-rest-framework

if serializer.is_valid():
    serializer.save()
    return Response(serializer.data, status=status.HTTP_201_CREATED)
Run Code Online (Sandbox Code Playgroud)

如何在serializer.data dict中添加一个额外的字段(非模型字段)?我想在发送响应之前添加("status":"available").我试过这个 -

if serializer.is_valid():
    serializer.save()
    ## This one doesn't work as serializer.data is of the type 'ReturnDict' 
    serializer.data.append(("status","available")) 
    ## OR
    serializer.data["status"]  = "available"
    return Response(serializer.data, status=status.HTTP_201_CREATED)
Run Code Online (Sandbox Code Playgroud)

我还想在发送响应之前修改serializer.data的字段名称.有没有办法做到这一点?

nor*_*ate 7

您可以向序列化程序添加一个额外的字段,如下所示:


class MySerializer(serializers.ModelSerializer)
    status = serializers.SerializerMethodField('get_status')

    class Meta: 
        model = MyModel
        read_only_fields = ('status',)

    def get_status(self, obj):
        """ Get the current objects status """
        if obj.available == 1:
            return 'available'
        else:
            return 'not available'
Run Code Online (Sandbox Code Playgroud)

更改字段名称的一种方法是使用中间件类来格式化响应.如果我必须格式化整个API的响应,我会这样做.