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 响应