Django Swagger 不允许我使用 POST 方法(未显示参数)
Django Swagger won't allow me to use POST method (no parameters shown)
我在 Django 项目中使用 djangorestframework
和 drf-spectacular
模块,我正在尝试为我的 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
对象,或者让您 POST 一个新对象。最后,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_view
和 project_detail_view
的 GET 有效,但我的问题出在 POST 方法上。
我的 Swagger 设置为在访问 http://127.0.0.1:8000/docs/ 时显示其 API 架构,正如我所说,GET 方法正常工作,但是当我尝试在 POST 方法,字段不显示。我只能按“执行”而实际上无法完成任何事情。在我点击“执行”后,Swagger returns 一个 404 Bad Request
响应。
这就是 POST 在 Swagger 中的样子:
我的问题是:为什么 Swagger 不为模型的每个参数显示字段?谢谢。
Swagger 从 serializer_class 变量中获取字段。
我真的建议您将格式更改为 Class-Based Views。
使用 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)
我在 Django 项目中使用 djangorestframework
和 drf-spectacular
模块,我正在尝试为我的 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
对象,或者让您 POST 一个新对象。最后,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_view
和 project_detail_view
的 GET 有效,但我的问题出在 POST 方法上。
我的 Swagger 设置为在访问 http://127.0.0.1:8000/docs/ 时显示其 API 架构,正如我所说,GET 方法正常工作,但是当我尝试在 POST 方法,字段不显示。我只能按“执行”而实际上无法完成任何事情。在我点击“执行”后,Swagger returns 一个 404 Bad Request
响应。
这就是 POST 在 Swagger 中的样子:
我的问题是:为什么 Swagger 不为模型的每个参数显示字段?谢谢。
Swagger 从 serializer_class 变量中获取字段。 我真的建议您将格式更改为 Class-Based Views。 使用 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)