Django - drf-yasg установка request_body в @swagger_auto_schema на уменьшенную версию сериализатора на @api_view

Есть ли способ установить request_body для @swagger_auto_schema только как часть сериализатора? Причина в том, что, как вы можете видеть ниже, создатель устанавливается текущим объектом пользователя, переданным аутентификатором в представление post_create, но если я установлю request_body для PostSerializer, это запутает других, потому что они будут считать, что ему нужен атрибут creator, хотя он анализируется от пользователя. Есть ли способ установить request_body для этой конечной точки, которая использует @api_view с некоторыми PostSerializer?

view.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)

serializer.py

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

Один из способов сделать это - реализовать второй Serializer только с соответствующим подмножеством полей, Что будет выглядеть следующим образом :

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)

Полагаю, что вам также следует удалить другие поля, такие как updated_at, которые должны вычисляться при выполнении, а не предоставляться пользователем API.

Вернуться на верх