【Django】DRF自定義數據返回格式


基本說明

在采用djangorestframework之后,api返回的數據結構默認如下圖所示:

但是通常resultful 的規范,后端返回 JSON 數據的格式有着不同的需求,那么我們必須能夠根據需求自己定義返回數據的格式。列如如下:

{
  "code": 200, //成功的狀態碼
  "msg": "success", //提示信息
  "data": { //返回數據
      "list": [{},{},{}], //返回數組
      "total": 238, //總條數(表格中用到,其它接口可以不返回)
  }
}

djangorestframwork可以通過自定義返回模板來重構返回數據的格式,我們查看restframework的默認設置可以看到,默認的模板是rest_framework.renderers.JSONRendererrest_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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM