Django使用drf-spectacular时Swagger POST方法无参数字段问题
问题原因
- 你使用的是DRF函数式视图(FBV),drf-spectacular无法自动推断不同请求方法对应的请求/响应序列化器结构,未显式声明的情况下,不会为POST方法关联
ProjectSerializer,因此生成的OpenAPI规范中没有对应请求体的字段定义,Swagger自然不会展示参数填写表单。 - 额外补充:你的
Project模型中date字段设置了auto_now_add=True,属于创建时自动赋值的字段,不需要用户在POST时传入,当前序列化器配置会导致OpenAPI错误要求用户提交date参数,同时实际POST请求传入的date也会被忽略。
解决步骤
- 首先导入drf-spectacular提供的
extend_schema装饰器,显式给视图指定请求/响应对应的序列化器 - 调整序列化器配置,把自动生成的
date字段设为只读,避免文档误导用户提交该字段 - 重启Django服务后刷新Swagger页面即可正常展示参数字段
调整后的序列化器代码
from rest_framework import serializers from api.models.Project import Project class ProjectSerializer(serializers.ModelSerializer): class Meta: model = Project fields = ['title', 'description', 'image', 'date'] # 新增:设置date为只读字段,POST请求无需提交 read_only_fields = ['date']
调整后的视图代码
from drf_spectacular.utils import extend_schema # 其余原有导入保持不变 # 新增装饰器,显式指定POST请求的序列化规则 @extend_schema( methods=['POST'], request=ProjectSerializer, responses={201: ProjectSerializer} ) @api_view(['GET', 'POST']) def project_list_view(request): if request.method == 'GET': projects = Project.objects.all() serializer = ProjectSerializer(projects, many=True) return Response(serializer.data) elif request.method == "POST": serializer = ProjectSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) # 可选:给详情视图补充schema声明,优化文档展示 @extend_schema( responses={200: ProjectSerializer, 404: None} ) @api_view(['GET']) def project_detail_view(request, pk): if request.method == "GET": try: project = Project.objects.get(pk = pk) serializer = ProjectSerializer(project, many = False) return Response(serializer.data, status = status.HTTP_200_OK) except: return Response(status=status.HTTP_404_NOT_FOUND)
内容的提问来源于stack exchange,提问作者Mario Mateaș
相关产品推荐
相关产品推荐

