Django Swagger 不允许我使用 POST 方法(未显示参数)

Posted

技术标签:

【中文标题】Django Swagger 不允许我使用 POST 方法(未显示参数)【英文标题】:Django Swagger won't allow me to use POST method (no parameters shown) 【发布时间】:2022-01-05 02:54:31 【问题描述】:

我将djangorestframeworkdrf-spectacular 模块一起用于一个Django 项目,并且我正在尝试为我的Project 模型构建一些基本的API 方法。它的结构是这样的:

from django.db import models

# Create your models here.

class Project(models.Model):
    title = models.CharField(max_length = 128)
    description = models.TextField()
    image = models.URLField()
    date = models.DateTimeField(auto_now_add=True)

我还有一个模型的序列化器,如下所示:

from rest_framework import serializers
from api.models.Project import Project


class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Project
        fields = ['title', 'description', 'image', 'date']

然后,在views.py 中,我创建了两个函数:project_list_view,它可以让您从数据库中获取所有Project 对象,或者让您发布一个新对象。最后是project_detail_view,它允许您通过输入pk(整数id)来获取Project 对象。这是我的两个功能:

@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)

@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)

来自project_list_viewproject_detail_view 的GET 工作,但我的问题在于POST 方法。 我的 Swagger 设置为在访问 http://127.0.0.1:8000/docs/ 时显示其 API Schema,正如我所说,GET 方法可以正常工作,但是当我尝试在 POST 方法中单击“试用”时,不会显示字段。我只能按“执行”而实际上无法完成任何事情。在我点击“执行”后,Swagger 会返回一个404 Bad Request 响应。

这就是 POST 在 Swagger 中的样子:

我的问题是:为什么 Swagger 不会为模型的每个参数显示字段?谢谢。

【问题讨论】:

【参考方案1】:

Swagger 从 serializer_class 变量中获取字段。 我真的建议您将格式更改为基于类的视图。 使用mixins or generic class.的东西

你的观点可能是这样的

class ProjectView(mixins.RetrieveModelMixin, mixins.CreateModelMixin, viewsets.GenericViewSet):

    permission_classes = [permissions.IsAuthenticated, ] 
    serializer_class = ProjectSerializer
    queryset = Project.objects.all()

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

More on Mixins and Generic Views

【讨论】:

感谢您的澄清,但我想先学习如何使用基于函数的视图。我想首先习惯“低级”的东西。难道我不能使用相同的基于函数的视图,而是以某种方式编辑序列化程序吗? 感谢您努力学习基于函数的视图。但我强烈建议迁移到基于类的视图,可以更好地与 swagger 等第三方合作,并为您的项目带来很多好处,例如可重用性、隐式代码、更快的开发等。我相信这是一种手动描述 post 请求正文的方法昂首阔步。不幸的是我不知道... 谢谢。将 POST 方法切换到基于类的视图。还将您的答案标记为回复!

以上是关于Django Swagger 不允许我使用 POST 方法(未显示参数)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django REST Swagger 中生成响应消息列表?

Django REST Swagger没有显示POST方法

将 Swagger 与 Django Rest Framework 一起使用,我可以在不同字段而不是一个正文中看到 POST 参数吗

从 Django REST Swagger 中排除 URL

django drf_yasg 非restful风格的api怎么在swagger上展示?

Swagger OpenApi 3.0 不允许 PUT 请求仅 POST 和 GET 工作