You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整Django REST Framework API的JSON响应格式?

调整DRF API的JSON响应结构与排版

一、修改JSON响应结构(拆分email_response/phone_response层级)

方法1:使用嵌套Serializer(推荐,符合DRF规范)

通过定义子Serializer分别处理两类响应数据,再用父Serializer组合成目标结构:

  1. 更新serializers.py:
from rest_framework import serializers
from .models import Email

class EmailResponseSerializer(serializers.ModelSerializer):
    # 自定义日期格式为YYYY/MM/DD
    creation_date = serializers.DateTimeField(format="%Y/%m/%d")
    
    class Meta:
        model = Email
        fields = ('user_email', 'creation_date', 'email_status', 'email_score', 'valid_email', 'fraud')

class PhoneResponseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Email
        fields = ('user_phone_number',)

class CombinedResponseSerializer(serializers.Serializer):
    email_response = EmailResponseSerializer()
    phone_response = PhoneResponseSerializer()
  1. 修改views.py的post方法:
    替换原有的序列化与返回逻辑:
# ... 原有保存NewEmail的代码 ...
NewEmail.save()
# 使用组合Serializer构造响应
combined_data = {
    'email_response': NewEmail,
    'phone_response': NewEmail
}
serializer = CombinedResponseSerializer(combined_data)
return Response(serializer.data)

方法2:手动构造响应字典(快速实现)

如果不需要复用Serializer逻辑,可直接在视图里拼接目标结构:

# ... 原有保存NewEmail的代码 ...
NewEmail.save()
base_serializer = EmailSerializer(NewEmail)
base_data = base_serializer.data

# 构造期望的层级结构
response_data = {
    "email_response": {
        "user_email": base_data["user_email"],
        "creation_date": base_data["creation_date"].strftime("%Y/%m/%d"),
        "email_status": base_data["email_status"],
        "email_score": base_data["email_score"],
        "valid_email": base_data["valid_email"],
        "fraud": base_data["fraud"]
    },
    "phone_response": {
        "user_phone_number": base_data["user_phone_number"]
    }
}
return Response(response_data)

二、调整JSON响应的排版(缩进、空格)

全局配置(所有API生效)

在项目settings.py中添加DRF配置,指定JSON渲染器的缩进:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
    ],
    'JSONRenderer': {
        'indent': 4,  # 设置缩进为4个空格
        'ensure_ascii': False  # 可选:支持中文等非ASCII字符
    }
}

局部配置(仅特定视图生效)

自定义JSON渲染器类,在目标视图中使用:

# views.py
from rest_framework.renderers import JSONRenderer
from rest_framework.views import APIView

class IndentedJSONRenderer(JSONRenderer):
    indent = 4

class UserListView(APIView):
    renderer_classes = [IndentedJSONRenderer]
    # ... 原有视图代码 ...

注意:生产环境建议关闭缩进(设置indent=None),以减少响应体积;开发环境开启缩进便于调试。

内容的提问来源于stack exchange,提问作者laur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:45:29