基本說明
在采用djangorestframework之后,api返回的數據結構默認如下圖所示:
但是通常resultful 的規范,后端返回 JSON 數據的格式有着不同的需求,那么我們必須能夠根據需求自己定義返回數據的格式。列如如下:
{
"code": 200, //成功的狀態碼
"msg": "success", //提示信息
"data": { //返回數據
"list": [{},{},{}], //返回數組
"total": 238, //總條數(表格中用到,其它接口可以不返回)
}
}
djangorestframwork可以通過自定義返回模板來重構返回數據的格式,我們查看restframework的默認設置可以看到,默認的模板是rest_framework.renderers.JSONRenderer
和rest_framework.renderers.BrowsableAPIRenderer
,其中第一個是用於前端接收數據時的數據格式模板,第二個是drf在api查看界面的數據顯示模式。
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
]
修改模板
如果我們想要修改返回給前端的數據格式,那么我們可以首先修改配置參數(settings.py)中的DEFAULT_RENDERER_CLASSES
,將rest_framework.renderers.JSONRenderer
修改為自己定義的模板類:
'DEFAULT_RENDERER_CLASSES': (
'utils.custome_renderer.CustomRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
),
這里有一個注意點就是在開發時如果需要通過drf的api查看界面查看相應的api一定要將這個模板加上
rest_framework.renderers.BrowsableAPIRenderer
,否則的話無法看到相應的界面,生產時無需該界面,也可通過相關命令關閉顯示。
utils.custome_renderer.CustomRenderer
其中utils.custome_render是自己的文件路徑可根據自己的實際情況進行修改,CustomRenderer是自己定義的返回模板類的名稱
from rest_framework.renderers import JSONRenderer
# 導入控制返回的JSON格式的類
class CustomRenderer(JSONRenderer):
# 重構render方法
def render(self, data, accepted_media_type=None, renderer_context=None):
if renderer_context:
# 判斷實例的類型,返回的數據可能是列表也可能是字典
if isinstance(data, dict):
# 如果是字典的話應該是返回的數據,會包含msg,code,status等字段必須抽離出來
msg = data.pop('msg', 'success')
code = data.pop('code', 200)
# 重新構建返回的JSON字典
if 'status' in data.keys():
del data['status']
data = data['data']
else:
data = data
# 自定義返回數據格式
ret = {
'msg': msg,
'code': code,
'data': {
'list': data,
'total': len(data),
},
}
# 返回JSON數據
return super().render(ret, accepted_media_type, renderer_context)
else:
return super().render(data, accepted_media_type, renderer_context)