繁体   English   中英

Django - drf-yasg 将 @swagger_auto_schema 中的 request_body 设置为 @api_view 上的序列化程序的简化版本

[英]Django - drf-yasg setting request_body in @swagger_auto_schema to reduced version of serializer on @api_view

有没有办法将@swagger_auto_schema request_body设置为仅作为序列化程序的一部分? 正如您在下面看到的那样,创建者的推理是由身份验证器传递给post_create视图的当前用户对象设置的,但是如果我将request_body设置为PostSerializer ,这会让其他人感到困惑,因为他们会认为它需要一个creator属性,即使是从用户那里解析出来的。 有没有办法可以为这个端点设置request_body ,它使用@api_view和一些PostSerializer

查看.py

@api_view(['POST'])
@swagger_auto_schema(
    operation_description="Create a post object"
)
def post_create(request):
    try:
        request.data['creator'] = str(request.user.uuid)
        post_serializer = PostSerializer(data=request.data)

        if post_serializer.is_valid(raise_exception=True):
            post_obj = post_serializer.save()

    except ValidationError as e:
        return Response(dict(error=str(e),
                             user_message=error_message_generic),
                        status=status.HTTP_400_BAD_REQUEST)

    return Response(post_serializer.data, status=status.HTTP_201_CREATED)

序列化程序.py

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ('creator', 'body', 'uuid', 'created', 'updated_at')

一种方法是实现仅包含相关字段子集的第二个序列化程序,如下所示:

class PostSerializerCreator(serializers.ModelSerializer):
    class Meta:
        model = Post
        # Only include the user-provided fields
        fields = ('body', 'uuid', 'created', 'updated_at')
@api_view(['POST'])
@swagger_auto_schema(
    request_body=PostSerializerCreator,
    operation_description="Create a post object"
)
def post_create(request):
    try:
        request.data['creator'] = str(request.user.uuid)
        post_serializer = PostSerializer(data=request.data)

        if post_serializer.is_valid(raise_exception=True):
            post_obj = post_serializer.save()

    except ValidationError as e:
        return Response(dict(error=str(e),
                             user_message=error_message_generic),
                        status=status.HTTP_400_BAD_REQUEST)

    return Response(post_serializer.data, status=status.HTTP_201_CREATED)

我想您还应该删除其他字段,例如应在执行时计算而不是由 API 用户提供的updated_at

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM