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

在DRF中如何将JSON响应从字典列表改为字典格式?

在Django REST Framework中修改响应格式为字典结构

一、修改响应为字典格式的方法

先说明:你给出的期望响应示例和当前响应都是列表结构,推测你实际想要的是将列表包裹在字典中(比如包含count和results字段的格式),以下是实现方案:

方法1:重写视图的list方法(针对列表视图)

如果你的视图继承自ListAPIView,直接重写list方法自定义响应结构即可:

from rest_framework.response import Response
from rest_framework.generics import ListAPIView
from .models import YourModel
from .serializers import YourSerializer

class YourListView(ListAPIView):
    queryset = YourModel.objects.all()
    serializer_class = YourSerializer

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        # 处理分页逻辑(如果启用分页)
        page = self.paginate_queryset(queryset)
        
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        
        serializer = self.get_serializer(queryset, many=True)
        # 自定义字典格式,按需添加字段
        return Response({
            "count": queryset.count(),
            "results": serializer.data
        })

方法2:自定义全局响应渲染器

如果想让所有列表接口统一返回字典格式,可自定义JSON渲染器:

from rest_framework.renderers import JSONRenderer

class CustomJSONRenderer(JSONRenderer):
    def render(self, data, accepted_media_type=None, renderer_context=None):
        # 判断是否为列表数据且非分页响应
        if isinstance(data, list) and not isinstance(data, dict):
            data = {
                "count": len(data),
                "results": data
            }
        return super().render(data, accepted_media_type, renderer_context)

然后在settings.py中配置全局生效:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'your_app.renderers.CustomJSONRenderer',  # 替换为你的渲染器路径
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ],
}

也可以仅在单个视图中指定使用该渲染器:

class YourListView(ListAPIView):
    renderer_classes = [CustomJSONRenderer]
    # 其他视图配置...

二、为什么接口默认返回字典列表?

DRF默认返回字典列表是有明确原因的:

  • RESTful规范约定:列表类接口(比如获取所有用户、所有订单)返回数组是行业通用的RESTful实践,直接返回列表能清晰传达“这是一组同类型资源”的语义。
  • 序列化器设计逻辑:当序列化器传入many=True时,会遍历查询集中的每个对象,逐个序列化后封装成列表返回,这是最直接的数据库对象到JSON数据的映射方式。
  • 轻量化选择:如果不需要分页,直接返回列表比嵌套字典更简洁;而DRF的分页响应本身已经是字典格式(包含count、next、previous、results字段),兼顾了不同场景的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:40:45