【问题标题】:drf_yasg @swagger_auto_schema not showing the required parameters for POST Requestdrf_yasg @swagger_auto_schema 未显示 POST 请求所需的参数
【发布时间】:2023-02-15 13:55:39
【问题描述】:

我正在使用 django-yasg 创建一个 api 文档。但是文档中没有显示用于创建发布请求的参数。以下是我的代码: 在那之后,在 swagger api 中,没有显示用于创建事件的发布请求的参数

模型.py

class Events(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    category = models.ForeignKey(EventCategory, on_delete=models.CASCADE)
    name = models.CharField(max_length=250, null=True)
    posted_at = models.DateTimeField(null=True, auto_now=True)
    location = models.CharField(max_length=100, null=True)
    banner = models.ImageField(default='avatar.jpg', upload_to='Banner_Images')
    start_date = models.DateField(
        auto_now=False, auto_now_add=False, blank=True, null=True)
    end_date = models.DateField(
        auto_now=False, auto_now_add=False, blank=True, null=True)
    description = models.TextField(max_length=2000, null=True)
    completed = models.BooleanField(default=False)

    def __str__(self):
        return f'{self.name}'

    class Meta:
        verbose_name_plural = "Events"

序列化程序.py

class EventSerializer(serializers.ModelSerializer):
    user = UserSerializer(read_only=True, many=False)
    category = EventCategorySerializer(read_only=True, many=False)

    class Meta:
        model = Events
        fields = '__all__'

视图.py

@api_view(['POST'])
@permission_classes([IsAuthenticated])
@user_is_organization
@swagger_auto_schema(
    request_body=EventSerializer
)
def registerEvent(request):
    """
        To Register an events, you must be an organization
    """
    data = request.data
    print("==================")
    print(data)
    print("==================")
    try:
        Event = Events.objects.create(
            user = request.user,
            category=EventCategory.objects.get(category=data['category']),
            name=data['name'],
            location=data['location'],
            start_date=data['start_date'],
            end_date=data['end_date'],
            description=data['description'],
            completed=data['completed'],
        )
        serializer = EventSerializer(Event, many=False)
        Event = Events.objects.get(id=serializer.data['id'])
        Event.banner = request.FILES.get('banner')
        Event.save()
        serializer = EventSerializer(Event, many=False)
        return Response(serializer.data)
    except:
        message = {'detail': 'Event with this content already exists'}
        return Response(message, status=status.HTTP_400_BAD_REQUEST)

【问题讨论】:

    标签: python django django-rest-framework swagger


    【解决方案1】:

    我在 views.py 中进行了以下更改使其运行

    @swagger_auto_schema(
        methods=['post'],
        request_body=openapi.Schema(
            type=openapi.TYPE_OBJECT,
            required=['category','name', 'location', 'start_date', 'end_date', 'description', 'completed', 'banner'],
            properties={
                'category':openapi.Schema(type=openapi.TYPE_STRING),
                'name':openapi.Schema(type=openapi.TYPE_STRING),
                'location':openapi.Schema(type=openapi.TYPE_STRING),
                'start_date':openapi.Schema(type=openapi.TYPE_STRING, default="yyyy-mm-dd"),
                'end_date':openapi.Schema(type=openapi.TYPE_STRING, default='yyyy-mm-dd'),
                'description':openapi.Schema(type=openapi.TYPE_STRING), 
                'completed':openapi.Schema(type=openapi.TYPE_BOOLEAN, default=False),
                'banner': openapi.Schema(type=openapi.TYPE_FILE),
            },
        ),
        operation_description='Create an events' 
    )
    @api_view(['POST'])
    @permission_classes([IsAuthenticated])
    @user_is_organization
    def registerEvent(request):
        """
            To Register an events, you must be an organization
        """
        data = request.data
        print("==================")
        print(data)
        print(type(data))
        category=EventCategory.objects.get(category=data['category']),
        print(category)
        print(type(data["start_date"]))
        print("==================")
        try:
            Event = Events.objects.create(
                user = request.user,
                category=EventCategory.objects.get(category=data['category']),
                name=data['name'],
                location=data['location'],
                start_date=data['start_date'],
                end_date=data['end_date'],
                description=data['description'],
                completed=data['completed'],
            )
            print("****************************")
            serializer = EventSerializer(Event, many=False)
            Event = Events.objects.get(id=serializer.data['id'])
            Event.banner = request.FILES.get('banner')
            Event.save()
            serializer = EventSerializer(Event, many=False)
            return Response(serializer.data)
        except ValidationError as e:
            return Response({"ValidationError" : e}, status = status.HTTP_400_BAD_REQUEST)
        except Exception as e:
            message = {'error': e}
            return Response(message, status=status.HTTP_400_BAD_REQUEST)
    

    【讨论】:

      【解决方案2】:

      你能修改你的swagger_auto_schema这样的装饰师?

      @swagger_auto_schema(
          methods=['post',],
          request_body=EventSerializer )
      

      【讨论】:

      • AssertionError: method or methods can only be specified on @action or @api_view views
      • @nirajan-bekoju 移动swagger_auto_schema超过api_view装饰器并从中删除方法swagger_auto_schema装潢师
      • 检测到相同错误
      【解决方案3】:

      您需要做的就是将@swagger_auto_schema 放在顶部。为了帮助它显示参数,为它创建一个序列化程序。这样,您以后只需更改序列化程序,将所有内容都保存在一个地方。

      API视图

      @swagger_auto_schema(request_body=serializers.RequestSerializer, method='post')
      @api_view(http_method_names=['POST'])
      def special_get(request):
          data = JSONParser().parse(request)
          unique_id = data.get("unique_id", "")
          ... 
      

      序列化器.py

      class RequestSerializer(serializers.Serializer):
          unique_id = serializers.CharField(max_length=50, allow_null=False, allow_blank=True)
          sentence_list = serializers.ListField(
              child=serializers.CharField(allow_blank=False, trim_whitespace=True)
          )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-05
        相关资源
        最近更新 更多