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

Posted

技术标签:

【中文标题】Django REST——如何在返回 REST 响应之前“修改”值?【英文标题】:Django REST -- How to "modify" value before returning the REST response? 【发布时间】:2016-02-11 23:43:11 【问题描述】:

我做了一些研究,但我不太确定我在技术上寻找什么,所以我没有找到太多信息。我正在使用 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

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

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

所以一个示例 JSON 响应是:

 name: "ferrari", speed: "fast" 

【问题讨论】:

【参考方案1】:

添加另一种方法 -

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"

【讨论】:

谢谢,在我的情况下帮助了第一个变体。【参考方案2】:

你可以使用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')

【讨论】:

是否需要fields = ('name', 'speed')?我没有包括它,它对我来说非常有用。只是想知道。 好吧,如果你想提取所有字段,则不需要。我通常使用非常大的模型,我只需要一些字段。但这不是必需的。 As of DRF 3.5, it is now required to use '__all__' if you want all fields. 这种方法的主要问题之一是它使字段read_only 不使字段只读

以上是关于Django REST——如何在返回 REST 响应之前“修改”值?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 django-rest-framework-jwt 在注册时返回令牌?

如何使用 django rest 框架禁用 HTML 错误页面的返回?

如何通过 Django Rest Framework 返回嵌套的 json

从 Django django-rest-framework 视图有条件地返回 JSON 或 HTML 响应

如何覆盖与响应 django rest framework 序列化程序一起返回的返回序列化程序对象

(二)Django REST实践:最简单的REST API实现