如何在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
相关产品推荐
相关产品推荐

