如何在Django REST Framework的Response返回响应中添加更多字段
解决方法
有两种常用的实现方案,你可以根据自己的使用场景选择:
方案1:直接在视图层合并字典(仅当前接口需要加字段时推荐)
Response接收的第一个参数是字典类型,你只需要把序列化返回的结果和你要加的额外字段合并为一个新字典即可:
@api_view(('GET',)) def get_status(request, task_id): task = current_app.AsyncResult(task_id) # 先拿到序列化后的图片数据 image_data = ImageSerializer(Image.objects.get(pk=task.get())).data # 定义要添加的额外字段 extra_context = {'task_status': task.status, 'task_id': task.id} # 合并两个字典,Python 3.9+支持|运算符,低版本替换为 {**image_data, **extra_context} 即可 final_data = image_data | extra_context return Response(final_data, status=status.HTTP_201_CREATED)
方案2:重写序列化器to_representation方法(多个接口复用序列化器时推荐)
如果你需要在所有用到ImageSerializer的接口都返回这两个task相关字段,可以直接修改序列化器,统一追加字段:
# 你的ImageSerializer定义文件 from rest_framework import serializers class ImageSerializer(serializers.ModelSerializer): # 原有字段、Meta配置保持不变 class Meta: model = Image fields = "__all__" # 替换为你原有的字段列表即可 def to_representation(self, instance): # 先拿到默认序列化结果 rep = super().to_representation(instance) # 从序列化器上下文获取传入的task对象 task = self.context.get("task") if task: rep["task_status"] = task.status rep["task_id"] = task.id return rep
对应修改视图层代码,给序列化器传入task上下文:
@api_view(('GET',)) def get_status(request, task_id): task = current_app.AsyncResult(task_id) image_obj = Image.objects.get(pk=task.get()) # 给序列化器传入上下文参数 response_data = ImageSerializer(image_obj, context={"task": task}) return Response(response_data.data, status=status.HTTP_201_CREATED)
内容的提问来源于stack exchange,提问作者PolarBear10
相关产品推荐
相关产品推荐

