【问题标题】:Django REST -- How to "modify" value before returning the REST response?Django REST——如何在返回 REST 响应之前“修改”值?
【发布时间】: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" }

【问题讨论】:

    标签: python django rest django-rest-framework


    【解决方案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')?我没有包括它,它对我来说非常有用。只是想知道。
    • 好吧,如果你想提取所有字段,则不需要。我通常使用非常大的模型,我只需要一些字段。但这不是必需的。
    • 这种方法的主要问题之一是它使字段read_only 不使字段只读
    猜你喜欢
    • 2013-04-09
    • 2021-07-13
    • 2015-01-26
    • 2018-03-24
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多