6.6 KiB
Использование dataclasses
FastAPI построен поверх Pydantic, и я показывал вам, как использовать Pydantic-модели для объявления HTTP-запросов и HTTP-ответов.
Но FastAPI также поддерживает использование dataclasses тем же способом:
{* ../../docs_src/dataclasses/tutorial001.py hl[1,7:12,19:20] *}
Это по-прежнему поддерживается благодаря Pydantic, так как в нём есть встроенная поддержка dataclasses.
Так что даже если в коде выше Pydantic не используется явно, FastAPI использует Pydantic, чтобы конвертировать стандартные dataclasses в собственный вариант dataclasses от Pydantic.
И, конечно, поддерживаются те же возможности:
- валидация данных
- сериализация данных
- документирование данных и т.д.
Это работает так же, как с Pydantic-моделями. И на самом деле под капотом это достигается тем же образом, с использованием Pydantic.
/// info | Информация
Помните, что dataclasses не умеют всего того, что умеют Pydantic-модели.
Поэтому вам всё ещё может потребоваться использовать Pydantic-модели.
Но если у вас уже есть набор dataclasses, это полезный приём — задействовать их для веб-API на FastAPI. 🤓
///
Dataclasses в response_model
Вы также можете использовать dataclasses в параметре response_model:
{* ../../docs_src/dataclasses/tutorial002.py hl[1,7:13,19] *}
Этот dataclass будет автоматически преобразован в Pydantic dataclass.
Таким образом, его схема появится в интерфейсе документации API:
Dataclasses во вложенных структурах данных
Вы также можете комбинировать dataclasses с другими аннотациями типов, чтобы создавать вложенные структуры данных.
В некоторых случаях вам всё же может понадобиться использовать версию dataclasses из Pydantic. Например, если у вас возникают ошибки с автоматически генерируемой документацией API.
В таком случае вы можете просто заменить стандартные dataclasses на pydantic.dataclasses, которая является полностью совместимой заменой (drop-in replacement):
{* ../../docs_src/dataclasses/tutorial003.py hl[1,5,8:11,14:17,23:25,28] *}
-
Мы по-прежнему импортируем
fieldиз стандартныхdataclasses. -
pydantic.dataclasses— полностью совместимая замена (drop-in replacement) дляdataclasses. -
Dataclass
Authorсодержит список dataclassItem. -
Dataclass
Authorиспользуется в параметреresponse_model. -
Вы можете использовать и другие стандартные аннотации типов вместе с dataclasses в качестве тела запроса.
В этом случае это список dataclass
Item. -
Здесь мы возвращаем словарь, содержащий
items, который является списком dataclass.FastAPI по-прежнему способен сериализовать данные в JSON.
-
Здесь
response_modelиспользует аннотацию типа — список dataclassAuthor.Снова, вы можете комбинировать
dataclassesсо стандартными аннотациями типов. -
Обратите внимание, что эта функция-обработчик пути использует обычный
defвместоasync def.Как и всегда в FastAPI, вы можете сочетать
defиasync defпо необходимости.Если хотите освежить в памяти, когда что использовать, посмотрите раздел "Нет времени?" в документации про
asyncиawait{.internal-link target=_blank}. -
Эта функция-обработчик пути возвращает не dataclasses (хотя могла бы), а список словарей с внутренними данными.
FastAPI использует параметр
response_model(в котором заданы dataclasses), чтобы преобразовать HTTP-ответ.
Вы можете комбинировать dataclasses с другими аннотациями типов множеством способов, чтобы формировать сложные структуры данных.
Смотрите подсказки в коде выше, чтобы увидеть более конкретные детали.
Узнать больше
Вы также можете комбинировать dataclasses с другими Pydantic-моделями, наследоваться от них, включать их в свои модели и т.д.
Чтобы узнать больше, посмотрите документацию Pydantic о dataclasses.
Версия
Доступно начиная с версии FastAPI 0.67.0. 🔖