6.2 KiB
Використання dataclasses
FastAPI побудовано поверх Pydantic, і я показував вам, як використовувати моделі Pydantic для оголошення запитів і відповідей.
Але FastAPI також підтримує використання dataclasses таким самим чином:
{* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *}
Це підтримується завдяки 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_py310.py hl[1,6:12,18] *}
Dataclass буде автоматично перетворено на dataclass Pydantic.
Таким чином його схема з'явиться в інтерфейсі користувача документації API:
Dataclasses у вкладених структурах даних
Можна поєднувати dataclasses з іншими анотаціями типів, щоб створювати вкладені структури даних.
У деяких випадках вам усе ж доведеться використовувати варіант dataclasses від Pydantic. Наприклад, якщо виникають помилки з автоматично згенерованою документацією API.
У такому разі ви можете просто замінити стандартні dataclasses на pydantic.dataclasses, що є взаємозамінником:
{* ../../docs_src/dataclasses_/tutorial003_py310.py hl[1,4,7:10,13:16,22:24,27] *}
-
Ми все ще імпортуємо
fieldзі стандартнихdataclasses. -
pydantic.dataclasses- це взаємозамінник для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), щоб перетворити відповідь.
Ви можете поєднувати dataclasses з іншими анотаціями типів у багатьох поєднаннях, щоб формувати складні структури даних.
Перегляньте підказки щодо анотацій у коді вище, щоб побачити більше деталей.
Дізнатися більше
Можна поєднувати dataclasses з іншими моделями Pydantic, наслідувати їх, включати у власні моделі тощо.
Щоб дізнатися більше, перегляньте документацію Pydantic про dataclasses.
Версія
Доступно починаючи з версії FastAPI 0.67.0. 🔖