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

