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

Django使用drf-spectacular时Swagger POST方法无参数字段问题

问题原因
  1. 你使用的是DRF函数式视图(FBV),drf-spectacular无法自动推断不同请求方法对应的请求/响应序列化器结构,未显式声明的情况下,不会为POST方法关联ProjectSerializer,因此生成的OpenAPI规范中没有对应请求体的字段定义,Swagger自然不会展示参数填写表单。
  2. 额外补充:你的Project模型中date字段设置了auto_now_add=True,属于创建时自动赋值的字段,不需要用户在POST时传入,当前序列化器配置会导致OpenAPI错误要求用户提交date参数,同时实际POST请求传入的date也会被忽略。
解决步骤
  1. 首先导入drf-spectacular提供的extend_schema装饰器,显式给视图指定请求/响应对应的序列化器
  2. 调整序列化器配置,把自动生成的date字段设为只读,避免文档误导用户提交该字段
  3. 重启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ș

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:45:03