Browse Source
Co-authored-by: ArtemKhymenko <[email protected]> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Rostyslav <[email protected]>pull/10343/head
committed by
GitHub
2 changed files with 172 additions and 0 deletions
@ -0,0 +1,42 @@ |
|||
# JSON Compatible Encoder |
|||
|
|||
Існують випадки, коли вам може знадобитися перетворити тип даних (наприклад, модель Pydantic) в щось сумісне з JSON (наприклад, `dict`, `list`, і т. д.). |
|||
|
|||
Наприклад, якщо вам потрібно зберегти це в базі даних. |
|||
|
|||
Для цього, **FastAPI** надає `jsonable_encoder()` функцію. |
|||
|
|||
## Використання `jsonable_encoder` |
|||
|
|||
Давайте уявимо, що у вас є база даних `fake_db`, яка приймає лише дані, сумісні з JSON. |
|||
|
|||
Наприклад, вона не приймає об'єкти типу `datetime`, оскільки вони не сумісні з JSON. |
|||
|
|||
Отже, об'єкт типу `datetime` потрібно перетворити в рядок `str`, який містить дані в <a href="https://en.wikipedia.org/wiki/ISO_8601" class="external-link" target="_blank">ISO форматі</a>. |
|||
|
|||
Тим самим способом ця база даних не прийматиме об'єкт типу Pydantic model (об'єкт з атрибутами), а лише `dict`. |
|||
|
|||
Ви можете використовувати `jsonable_encoder` для цього. |
|||
|
|||
Вона приймає об'єкт, такий як Pydantic model, і повертає його версію, сумісну з JSON: |
|||
|
|||
=== "Python 3.10+" |
|||
|
|||
```Python hl_lines="4 21" |
|||
{!> ../../../docs_src/encoder/tutorial001_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.6+" |
|||
|
|||
```Python hl_lines="5 22" |
|||
{!> ../../../docs_src/encoder/tutorial001.py!} |
|||
``` |
|||
|
|||
У цьому прикладі вона конвертує Pydantic model у `dict`, а `datetime` у `str`. |
|||
|
|||
Результат виклику цієї функції - це щось, що можна кодувати з використанням стандарту Python <a href="https://docs.python.org/3/library/json.html#json.dumps" class="external-link" target="_blank">`json.dumps()`</a>. |
|||
|
|||
Вона не повертає велику строку `str`, яка містить дані у форматі JSON (як строка). Вона повертає стандартну структуру даних Python (наприклад `dict`) із значеннями та підзначеннями, які є сумісними з JSON. |
|||
|
|||
!!! Примітка |
|||
`jsonable_encoder` фактично використовується **FastAPI** внутрішньо для перетворення даних. Проте вона корисна в багатьох інших сценаріях. |
@ -0,0 +1,130 @@ |
|||
# Додаткові типи даних |
|||
|
|||
До цього часу, ви використовували загальнопоширені типи даних, такі як: |
|||
|
|||
* `int` |
|||
* `float` |
|||
* `str` |
|||
* `bool` |
|||
|
|||
Але можна також використовувати більш складні типи даних. |
|||
|
|||
І ви все ще матимете ті ж можливості, які були показані до цього: |
|||
|
|||
* Чудова підтримка редактора. |
|||
* Конвертація даних з вхідних запитів. |
|||
* Конвертація даних для відповіді. |
|||
* Валідація даних. |
|||
* Автоматична анотація та документація. |
|||
|
|||
## Інші типи даних |
|||
|
|||
Ось додаткові типи даних для використання: |
|||
|
|||
* `UUID`: |
|||
* Стандартний "Універсальний Унікальний Ідентифікатор", який часто використовується як ідентифікатор у багатьох базах даних та системах. |
|||
* У запитах та відповідях буде представлений як `str`. |
|||
* `datetime.datetime`: |
|||
* Пайтонівський `datetime.datetime`. |
|||
* У запитах та відповідях буде представлений як `str` в форматі ISO 8601, як: `2008-09-15T15:53:00+05:00`. |
|||
* `datetime.date`: |
|||
* Пайтонівський `datetime.date`. |
|||
* У запитах та відповідях буде представлений як `str` в форматі ISO 8601, як: `2008-09-15`. |
|||
* `datetime.time`: |
|||
* Пайтонівський `datetime.time`. |
|||
* У запитах та відповідях буде представлений як `str` в форматі ISO 8601, як: `14:23:55.003`. |
|||
* `datetime.timedelta`: |
|||
* Пайтонівський `datetime.timedelta`. |
|||
* У запитах та відповідях буде представлений як `float` загальної кількості секунд. |
|||
* Pydantic також дозволяє представляти це як "ISO 8601 time diff encoding", <a href="https://pydantic-docs.helpmanual.io/usage/exporting_models/#json_encoders" class="external-link" target="_blank">більше інформації дивись у документації</a>. |
|||
* `frozenset`: |
|||
* У запитах і відповідях це буде оброблено так само, як і `set`: |
|||
* У запитах список буде зчитано, дублікати будуть видалені та він буде перетворений на `set`. |
|||
* У відповідях, `set` буде перетворений на `list`. |
|||
* Згенерована схема буде вказувати, що значення `set` є унікальними (з використанням JSON Schema's `uniqueItems`). |
|||
* `bytes`: |
|||
* Стандартний Пайтонівський `bytes`. |
|||
* У запитах і відповідях це буде оброблено як `str`. |
|||
* Згенерована схема буде вказувати, що це `str` з "форматом" `binary`. |
|||
* `Decimal`: |
|||
* Стандартний Пайтонівський `Decimal`. |
|||
* У запитах і відповідях це буде оброблено так само, як і `float`. |
|||
* Ви можете перевірити всі дійсні типи даних Pydantic тут: <a href="https://pydantic-docs.helpmanual.io/usage/types" class="external-link" target="_blank">типи даних Pydantic</a>. |
|||
|
|||
## Приклад |
|||
|
|||
Ось приклад *path operation* з параметрами, використовуючи деякі з вищезазначених типів. |
|||
|
|||
=== "Python 3.10+" |
|||
|
|||
```Python hl_lines="1 3 12-16" |
|||
{!> ../../../docs_src/extra_data_types/tutorial001_an_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.9+" |
|||
|
|||
```Python hl_lines="1 3 12-16" |
|||
{!> ../../../docs_src/extra_data_types/tutorial001_an_py39.py!} |
|||
``` |
|||
|
|||
=== "Python 3.6+" |
|||
|
|||
```Python hl_lines="1 3 13-17" |
|||
{!> ../../../docs_src/extra_data_types/tutorial001_an.py!} |
|||
``` |
|||
|
|||
=== "Python 3.10+ non-Annotated" |
|||
|
|||
!!! tip |
|||
Бажано використовувати `Annotated` версію, якщо це можливо. |
|||
|
|||
```Python hl_lines="1 2 11-15" |
|||
{!> ../../../docs_src/extra_data_types/tutorial001_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.6+ non-Annotated" |
|||
|
|||
!!! tip |
|||
Бажано використовувати `Annotated` версію, якщо це можливо. |
|||
|
|||
```Python hl_lines="1 2 12-16" |
|||
{!> ../../../docs_src/extra_data_types/tutorial001.py!} |
|||
``` |
|||
|
|||
Зверніть увагу, що параметри всередині функції мають свій звичайний тип даних, і ви можете, наприклад, виконувати звичайні маніпуляції з датами, такі як: |
|||
|
|||
=== "Python 3.10+" |
|||
|
|||
```Python hl_lines="18-19" |
|||
{!> ../../../docs_src/extra_data_types/tutorial001_an_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.9+" |
|||
|
|||
```Python hl_lines="18-19" |
|||
{!> ../../../docs_src/extra_data_types/tutorial001_an_py39.py!} |
|||
``` |
|||
|
|||
=== "Python 3.6+" |
|||
|
|||
```Python hl_lines="19-20" |
|||
{!> ../../../docs_src/extra_data_types/tutorial001_an.py!} |
|||
``` |
|||
|
|||
=== "Python 3.10+ non-Annotated" |
|||
|
|||
!!! tip |
|||
Бажано використовувати `Annotated` версію, якщо це можливо. |
|||
|
|||
```Python hl_lines="17-18" |
|||
{!> ../../../docs_src/extra_data_types/tutorial001_py310.py!} |
|||
``` |
|||
|
|||
=== "Python 3.6+ non-Annotated" |
|||
|
|||
!!! tip |
|||
Бажано використовувати `Annotated` версію, якщо це можливо. |
|||
|
|||
```Python hl_lines="18-19" |
|||
{!> ../../../docs_src/extra_data_types/tutorial001.py!} |
|||
``` |
Loading…
Reference in new issue