Django REST - 如何在返回REST响应之前“修改”值?

时间:2015-11-10 22:48:08

标签: python django rest django-rest-framework

我做了一些研究,但我不太确定我在技术上寻找什么,所以我找不到太多信息。我正在使用Django REST。

模型

class Car(models.Model)
    name =  name = models.CharField(blank=True, null=True, db_index=True)
    speed = models.IntegerField(default=SPEED.FAST)

查看

class CarViewSet(viewsets.ModelViewSet):
    queryset = Car.objects.all()
    serializer_class = CarSerializer

序列化程序

class CarSerializer(serializers.ModelSerializer):
    class Meta:
        model = Car

问题: speed模型中的Car字段是一个整数,当我访问REST端点API时,我不想返回一个整数,而是一个字符串。基本上是:

if speed is 0:
    return "slow"
else:
    return "fast" 

所以JSON响应的示例是:

{ name: "ferrari", speed: "fast" }

2 个答案:

答案 0 :(得分:12)

您可以使用SerializerMethodField

class CarSerializer(serializers.ModelSerializer):

    speed = serializers.SerializerMethodField()

    def get_speed(self, obj):
        if obj.speed == 0:
            return "slow"
        else:
            return "fast"

    class Meta:
        model = Car
        fields = ('name', 'speed')

答案 1 :(得分:3)

添加另一种方法-

class CarSerializer(serializers.ModelSerializer):

    class Meta:
        model = Car
        fields = ('name', 'speed')

    def to_representation(self, data):
        data = super(CarSerializer, self).to_representation(data)
        data['speed'] = 'slow' if data.get('speed') == 0 else 'fast'
        return data

@Gocht答案中的一项改进。 更好的做法是在方法get_speed中使用条件返回时省略多余的else语句-

def get_speed(self, obj):
    if obj.speed == 0:
        return "slow"
    return "fast"