Определите схему компонентов с помощью drf-Spectrum для django API
Я использую drf-spectular для создания схемы OpenAPI для django. Поскольку я не использую сериализаторы, я определяю все в
extend_schema
декоратор. Теперь у меня вопрос, можно ли вручную определить схему компонентов.
Вот пример того, как выглядит мое представление api:
from rest_framework.decorators import api_view
from drf_spectacular.utils import (extend_schema, OpenApiExample)
from drf_spectacular.types import OpenApiTypes
from rest_framework.response import Response
@extend_schema(
examples=[OpenApiExample(
value=[
{'title': 'A title'},
{'title': 'Another title'},
],
)],
responses={
200: OpenApiTypes.OBJECT
}
)
@api_view(['GET'])
def list_articles(request):
return Response([{'title': 'Test1'}, {'title': 'Test2'}])
и соответствующий компонент отображается как пустой (например, в чванстве):
Вот определение в документации, но я не могу понять, как этого добиться с помощью drf-Spectular.
2 ответа
OpenApiTypes.OBJECT
означает, что объект ответа может иметь любое количество полей. Конечно, пользовательский интерфейс Swagger не может знать эти поля заранее, поэтому он показывает
{}
, что может показаться нелогичным, но это правильно.
Вы хотите придать своему ответу некоторую структуру. Все впечатляющее вращается вокруг сериализаторов / компонентов. Если вы не хотите иметь явные сериализаторы, вы можете создавать неявные с помощью inline_serializer
from drf_spectacular.utils import extend_schema, OpenApiExample, inline_serializer
@extend_schema(
examples=[OpenApiExample(
value=[
{'title': 'A title'},
{'title': 'Another title'},
],
)],
responses={
200: inline_serializer(
name='Article',
fields={
'title': serializers.CharField(),
}
)
}
)
@api_view(['GET'])
def list_articles(request):
pass
Также можно использовать простой словарь вместо
@extend_schema(
...
responses={
(200, 'text/html'): {
'description': 'Simple HTML page',
'type': 'string',
'example': '<html>Example text</html>'
},
(202, 'application/json'): {
'description': 'JSON response',
'type': 'object',
'properties': {
'title': {
'type': 'string',
'minLength': 1,
'maxLength': 128
}
},
'required': [
'title'
]
},
}
)
...