Estoy usando djangorestframework junto con módulos drf-spectacular para un proyecto de Django, y estoy tratando de construir algunos métodos API básicos para mi modelo de Project . Su estructura se ve así:
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)También tengo un serializador para el modelo, con este aspecto:
from rest_framework import serializers from api.models.Project import Project class ProjectSerializer(serializers.ModelSerializer): class Meta: model = Project fields = ['title', 'description', 'image', 'date'] Luego, en views.py , creé dos funciones: project_list_view , que le permite OBTENER todos los objetos del Project de la base de datos, o le permite PUBLICAR un nuevo objeto. Y, por último, project_detail_view , que le permite OBTENER un objeto de Project escribiendo su pk ( id entero). Estas son mis dos funciones:
@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) GET de project_list_view y project_detail_view funcionan, pero mi problema radica en el método POST. Mi Swagger está configurado para mostrar su esquema de API al acceder a http://127.0.0.1:8000/docs/ y, como dije, los métodos GET funcionan correctamente, pero cuando trato de hacer clic en "Pruébelo" en el Método POST, los campos no se muestran. Solo puedo presionar "Ejecutar" sin poder completar nada. Después de hacer clic en "Ejecutar", Swagger devuelve una respuesta de 404 Bad Request .
Así es como se ve POST en Swagger:
Mi pregunta es: ¿Por qué Swagger no muestra campos para cada parámetro del modelo? Gracias.
Swagger Toma los campos de una variable serializer_class . Realmente recomiendo que cambie el formato a Vistas basadas en clases. Algo usando mixins o clase genérica.
Su vista podría ser como
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)