如何调整Django REST Framework API的JSON响应格式?
调整DRF API的JSON响应结构与排版
一、修改JSON响应结构(拆分email_response/phone_response层级)
方法1:使用嵌套Serializer(推荐,符合DRF规范)
通过定义子Serializer分别处理两类响应数据,再用父Serializer组合成目标结构:
- 更新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()
- 修改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
相关产品推荐
相关产品推荐

