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.