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

drf-spectacular的extend_schema请求参数是否有替代serializer的实现方案?

你之前的写法不生效的原因是:drf-spectacular的extend_schema装饰器中,request参数对应的值仅支持序列化器类/实例、OpenApiSchema对象两种格式,直接传入普通字典无法被识别解析,因此不会生效。

以下两种方案都可以实现需求,无需单独定义额外的小型序列化器:

方案1:直接使用OpenApiSchema定义请求结构

提前导入OpenApiSchema和OpenApiTypes即可直接在装饰器内定义请求结构,示例如下:

from drf_spectacular.utils import extend_schema, OpenApiSchema, OpenApiTypes

@extend_schema(
    request={
        'application/x-www-form-urlencoded': OpenApiSchema(
            type='object',
            properties={
                'foo_id': OpenApiTypes.INT,
                'other_field': OpenApiTypes.STR
            },
            required=['foo_id']
        )
    },
    responses={200: DoTheActionOutputsSerializer},
    methods=["POST"]
)
@action(methods=['post'], detail=False)
def do_the_action(self, request, *args, **kwargs):
    ...

方案2:使用inline_serializer生成临时序列化器

这种方式兼容DRF原生序列化器字段的所有配置,支持直接设置校验规则、说明文本等,更符合DRF的使用习惯,示例如下:

from drf_spectacular.utils import extend_schema, inline_serializer
from rest_framework import serializers

@extend_schema(
    request={
        'application/x-www-form-urlencoded': inline_serializer(
            name='DoTheActionInputSerializer',
            fields={
                'foo_id': serializers.IntegerField(required=True, help_text='目标资源ID'),
                'other_field': serializers.CharField(required=False, max_length=32)
            }
        )
    },
    responses={200: DoTheActionOutputsSerializer},
    methods=["POST"]
)
@action(methods=['post'], detail=False)
def do_the_action(self, request, *args, **kwargs):
    ...

两种方案都可以强制swagger/redoc测试页使用application/x-www-form-urlencoded格式发起请求,参数会被放入请求体而非拼接在查询字符串中,你的Django端点可以直接从request.data中获取到对应参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:24:03