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

Ric*_*opo 11 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)
Run Code Online (Sandbox Code Playgroud)

视图

class CarViewSet(viewsets.ModelViewSet):
    queryset = Car.objects.all()
    serializer_class = CarSerializer
Run Code Online (Sandbox Code Playgroud)

串行

class CarSerializer(serializers.ModelSerializer):
    class Meta:
        model = Car
Run Code Online (Sandbox Code Playgroud)

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

if speed is 0:
    return "slow"
else:
    return "fast" 
Run Code Online (Sandbox Code Playgroud)

所以JSON响应的示例如下:

{ name: "ferrari", speed: "fast" }
Run Code Online (Sandbox Code Playgroud)

Goc*_*cht 17

你可以使用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')
Run Code Online (Sandbox Code Playgroud)

  • 好吧,如果您想拉取所有字段,则不需要。我通常使用非常大的模型,我只需要一些字段。但这不是必需的。 (2认同)
  • 这种方法的主要问题之一是它使字段“只读”是否有更好的方法通过不使字段只读来实现此目的 (2认同)

Ans*_*ari 8

添加另一种方法 -

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
Run Code Online (Sandbox Code Playgroud)

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

def get_speed(self, obj):
    if obj.speed == 0:
        return "slow"
    return "fast"
Run Code Online (Sandbox Code Playgroud)