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

DRF中Swagger Schema显示错误,如何修正列表返回的API文档?

问题描述

我定义了如下ViewSet:

class MyViewSet:
    @action(detail=False)
    def statuses(self, *args, **kwargs):
        serializer = self.get_serializer(MyModel.Statuses, many=True)
        return Response(serializer.data)

对应的Serializer:

class LabelValueSerializer(serializers.Serializer):
    label = serializers.CharField()
    value = serializers.CharField()

    class Meta:
        fields = ("label", "value")

接口实际返回的响应是正确的列表格式:

[
  {
    "label": "New",
    "value": "new"
  },
  {
    "label": "Processing",
    "value": "processing"
  },
  {
    "label": "Finished",
    "value": "finished"
  }
]

但Swagger生成的API Schema错误地显示仅返回单个对象,而非列表。需要修正为显示列表格式:

[
  {
    "label": string,
    "value": string
  }
]
解决方案

方法1:用swagger_auto_schema显式指定列表类型

通过swagger_auto_schema装饰器直接告诉Swagger接口返回的是序列化器的列表实例:

from drf_yasg.utils import swagger_auto_schema

class MyViewSet:
    @swagger_auto_schema(responses={200: LabelValueSerializer(many=True)})
    @action(detail=False)
    def statuses(self, *args, **kwargs):
        serializer = self.get_serializer(MyModel.Statuses, many=True)
        return Response(serializer.data)

这个方式能精准控制Swagger显示的响应结构,让它明确识别出这是一个列表而非单个对象。

方法2:给ViewSet指定默认serializer_class

如果你的ViewSet没设置serializer_class,get_serializer可能无法正确推断序列化器类型,导致Swagger识别错误。给ViewSet加上默认序列化器:

class MyViewSet:
    serializer_class = LabelValueSerializer

    @action(detail=False)
    def statuses(self, *args, **kwargs):
        serializer = self.get_serializer(MyModel.Statuses, many=True)
        return Response(serializer.data)

这样get_serializer结合many=True参数,能让Swagger正确识别响应为列表格式。

方法3:手动构建响应Schema

如果前两种方法不生效,直接手动定义数组类型的响应结构:

from drf_yasg.utils import swagger_auto_schema
from drf_yasg import openapi

class MyViewSet:
    @swagger_auto_schema(
        responses={
            200: openapi.Response(
                description="状态列表",
                schema=openapi.Schema(
                    type=openapi.TYPE_ARRAY,
                    items=openapi.Schema(
                        type=openapi.TYPE_OBJECT,
                        properties={
                            'label': openapi.Schema(type=openapi.TYPE_STRING),
                            'value': openapi.Schema(type=openapi.TYPE_STRING)
                        }
                    )
                )
            )
        }
    )
    @action(detail=False)
    def statuses(self, *args, **kwargs):
        serializer = self.get_serializer(MyModel.Statuses, many=True)
        return Response(serializer.data)

手动描述Schema的数组和对象结构,确保Swagger生成完全符合预期的文档。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:24:59