Есть ли альтернатива использованию сериализатора для параметра запроса extend_schema drf-spectacular?

#django #django-rest-framework #drf-spectacular

Вопрос:

Я использую drf-spectacular для создания документации по API swagger/redoc.

Одна из самых полезных функций является возможность тестировать запросы с помощью создаваемого Swagger HTML-страницу, но я хотел бы реализовать приложение/х-www-формы-urlencoded типа контента, так что, когда запрос поступает на моем Джанго конечные точки запроса.сведения присвоен закодированные данные, а не его окончание как часть строки запроса. ДРФ-эффектный всегда кажется, что по умолчанию для строки запроса, например /объектов/действий/?ключ=значение

Единственный способ, которым я понял, как это сделать,-это использовать сериализатор в сочетании с типом содержимого запроса, например

 @extend_schema(
    request={'application/x-www-form-urlencoded': DoTheActionInputsSerializer},
    responses={200: DoTheActionOutputsSerializer},
    methods=["POST"]
)
@action(methods=['post'], detail=False)
def do_the_action(self, request, *args, **kwargs):
    ...
 

Это отлично работает, но для этого требуется множество небольших сериализаторов, которые могут иметь только один или два атрибута. Есть ли альтернативный способ добиться этого внутри декоратора extend_schema?

Я надеялся, что сработает что-то вроде следующего, но не получается

 request={'application/x-www-form-urlencoded': {'schema': {'foo_id': OpenApiTypes.INT}}},
 

Ответ №1:

Я думаю, что документация отвечает на этот вопрос. Вы можете использовать inline_serializer для этих небольших одноразовых случаев. Это позволяет вам сделать это:

     @extend_schema(responses={
        '2XX': SimpleSerializer,
        '401': inline_serializer('Error1', fields={'detail': serializers.CharField()}),
    })
 

Это работает так же для @extend_schema(request=inline_serializer(...))

В крайнем случае, вы также можете поместить необработанную схему в request или response .

Примечание: Если вы хотите application/x-www-form-urlencoded , чтобы вас обнаружили автоматически, просто сделайте это

 @action(methods=['post'], detail=False, parser_classes=[parsers.FormParser])
 

Комментарии:

1. Спасибо. Я не могу поверить, что полностью пропустил это. В случае, если это кому-то поможет, необработанная схема, чтобы попытаться создать простой сериализатор, в итоге выглядела следующим образом, поэтому не очень полезно. запрос={‘приложение/json’: { «тип»: «объект», «свойства»: { «идентификатор»: { «тип»: «целое число», «формат»: «int64» }, }, «требуется»: [ «идентификатор», ], «пример»: { «идентификатор»: 123456789012345678 } } },