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

如何在Django Rest Framework中重写列表接口的响应格式?

实现带外层users键的响应格式

有两种实用的方式可以达成你的需求:

方法一:重写ListAPIView的list方法

这是最直接的修改方式,无需新增Serializer,直接在视图中调整响应结构:

class UserListView(ListAPIView):
    model = User
    serializer_class = UserSerializer

    def list(self, request, *args, **kwargs):
        # 获取经过过滤的查询集
        queryset = self.filter_queryset(self.get_queryset())
        # 序列化用户列表数据
        serializer = self.get_serializer(queryset, many=True)
        # 将序列化结果包装到`users`键下返回
        return Response({'users': serializer.data})

方法二:使用包装类Serializer

如果多个视图都需要这种外层包装的格式,可以定义一个通用的包装Serializer来复用逻辑:

首先创建包装用的Serializer:

class UserListSerializer(serializers.Serializer):
    users = UserSerializer(many=True)

然后修改视图,用这个包装Serializer处理响应:

class UserListView(ListAPIView):
    model = User
    serializer_class = UserSerializer

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        # 先序列化用户列表,再包装到`users`键中
        wrapped_data = {'users': self.get_serializer(queryset, many=True).data}
        # 用包装Serializer验证并输出最终结构
        wrapped_serializer = UserListSerializer(data=wrapped_data)
        wrapped_serializer.is_valid(raise_exception=True)
        return Response(wrapped_serializer.data)

如果希望视图直接使用包装Serializer作为serializer_class,也可以调整如下:

class UserListView(ListAPIView):
    model = User
    serializer_class = UserListSerializer

    def get_serializer(self, *args, **kwargs):
        # 适配包装Serializer的数据源传递逻辑
        if args:
            return self.serializer_class({'users': args[0]}, **kwargs)
        return super().get_serializer(*args, **kwargs)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 21:11:29