如何为swagger_auto_schema的request_body设置属性,解决数组items配置报错问题
swagger_auto_schema request_body数组类型参数配置方案
swagger_auto_schema的request_body属性完全支持自定义配置,你遇到的报错是数组类型参数的items字段配置不规范导致的,错误原因是openapi.Schema中TYPE_ARRAY对应的items参数不能直接传入Serializer类,需要传入Schema对象或者序列化器引用。
核心修改点:将原来直接传入UsersSerializer的位置替换为openapi.SchemaRef(UsersSerializer)
修正后的完整代码如下:
@swagger_auto_schema( operation_description="修改用户所属店铺", method='PUT', request_body=openapi.Schema( type=openapi.TYPE_OBJECT, properties={ 'name': openapi.Schema(type=openapi.TYPE_STRING, description='店铺名称'), 'description': openapi.Schema(type=openapi.TYPE_STRING, description='店铺描述'), 'logo': openapi.Schema(type=openapi.TYPE_FILE, description='店铺logo文件'), 'cover_picture': openapi.Schema(type=openapi.TYPE_FILE, description='店铺封面图文件'), 'category': openapi.Schema(type=openapi.TYPE_STRING, description='店铺分类'), 'phone_number': openapi.Schema(type=openapi.TYPE_STRING, description='联系电话'), 'email': openapi.Schema(type=openapi.TYPE_STRING, description='联系邮箱'), 'coords_lat': openapi.Schema(type=openapi.TYPE_STRING, description='纬度坐标'), 'coords_lng': openapi.Schema(type=openapi.TYPE_STRING, description='经度坐标'), 'audio': openapi.Schema(type=openapi.TYPE_FILE, description='音频介绍文件'), 'address': openapi.Schema(type=openapi.TYPE_STRING, description='店铺地址'), 'admin': openapi.Schema( type=openapi.TYPE_ARRAY, description='店铺管理员列表', items=openapi.SchemaRef(UsersSerializer) ), } ) )
如果你不需要引用完整的UsersSerializer,也可以手动定义数组内元素的Schema结构,示例如下:
'admin': openapi.Schema( type=openapi.TYPE_ARRAY, description='店铺管理员列表', items=openapi.Schema( type=openapi.TYPE_OBJECT, properties={ 'id': openapi.Schema(type=openapi.TYPE_INTEGER, description='管理员用户ID'), 'username': openapi.Schema(type=openapi.TYPE_STRING, description='管理员用户名') } ) )
补充注意事项
- 如果当前接口使用multipart/form-data格式传参,嵌套数组/对象的解析需要提前配置对应解析器,否则可能出现后端接收参数异常的问题
- 如果你使用的是较新版本的drf-yasg,也可以直接将request_body的值设置为对应序列化器类,不需要手动编写Schema结构,插件会自动生成接口文档
内容的提问来源于stack exchange,提问作者gustavodelamou
相关产品推荐
相关产品推荐

