簡體   English   中英

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

[英]Django REST -- How to "modify" value before returning the REST response?

我做了一些研究,但我不太確定我在技術上要尋找什么,所以我沒有找到太多信息。 我正在使用 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" }

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

添加另一種方法 -

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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM