mirror of https://github.com/tiangolo/fastapi.git
🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/extra-data-types.md` (#10132)
Co-authored-by: ArtemKhymenko <ak@workconsult.ua> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Rostyslav <rostik1410@users.noreply.github.com>
This commit is contained in:
parent
99ffbcdee0
commit
b2f8ac6a83
|
|
@ -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