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

