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

如何在DRF函数视图中用drf_spectacular展示请求体

解决drf_spectacular为GET函数视图生成查询参数文档的问题

你的核心问题在于:GET请求的参数是URL查询参数(query params),而你用了request参数来配置——这个参数是用来定义POST/PUT等请求的requestBody的,GET请求不会识别它。另外你的视图里还犯了一个小错误:GET请求的参数应该从request.query_params获取,而不是request.data。

下面是针对函数视图的具体解决方案:

1. 修正视图的参数获取逻辑

首先把视图里的参数初始化代码改成从query_params取数据:

params = OrderInfoParamsSerializer(data=request.query_params)

2. 用parameters参数配置查询参数文档

在@extend_schema里替换掉request,改用parameters参数,有两种常用方式:

方式一:从序列化器自动生成参数(推荐)

直接用OpenApiParameter.from_serializer把你的序列化器转换成查询参数配置,代码更简洁:

from drf_spectacular.utils import extend_schema, OpenApiParameter

@extend_schema(
    summary="Fetch order information",
    description="This endpoint filter orders based on the provided parameters.",
    tags=["orders"],
    # 替换原来的request参数为下面的parameters
    parameters=[
        OpenApiParameter.from_serializer(OrderInfoParamsSerializer)
    ],
    responses={
        200: OrderInfoSerializer(many=True),
    },
)
@api_view(["GET"])
@token_required
def order_info(request: Request) -> Response:
    params = OrderInfoParamsSerializer(data=request.query_params)
    if not params.is_valid():
        return Response({"error": params.errors}, status=status.HTTP_400_BAD_REQUEST)

    params = params.validated_data
   
    # 后续业务逻辑...

方式二:手动定义单个参数(适合精细控制)

如果需要对某个参数做特殊配置,可以手动定义每个OpenApiParameter:

from drf_spectacular.utils import extend_schema, OpenApiParameter

@extend_schema(
    summary="Fetch order information",
    description="This endpoint filter orders based on the provided parameters.",
    tags=["orders"],
    parameters=[
        OpenApiParameter(
            name="order_id",
            type=int,
            location=OpenApiParameter.QUERY,  # 指定是查询参数
            required=False,
            description="Filter by order ID"
        )
    ],
    responses={
        200: OrderInfoSerializer(many=True),
    },
)
# 视图函数同上...

为什么类视图POST有效GET无效?

因为POST请求的参数是放在请求体里的,类视图用request参数配置会生效;但GET请求的参数是查询参数,不管是类视图还是函数视图,都需要用parameters参数来配置,而不是request。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 16:52:45