mirror of https://github.com/tiangolo/fastapi.git
101 lines
6.8 KiB
Markdown
101 lines
6.8 KiB
Markdown
# Тіло — Оновлення { #body-updates }
|
||
|
||
## Оновлення із заміною за допомогою `PUT` { #update-replacing-with-put }
|
||
|
||
Щоб оновити елемент, ви можете використати <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT" class="external-link" target="_blank">HTTP `PUT`</a> операцію.
|
||
|
||
Ви можете використати `jsonable_encoder`, щоб перетворити вхідні дані на такі, які можна зберігати як JSON (наприклад, у NoSQL базі даних). Наприклад, перетворюючи `datetime` у `str`.
|
||
|
||
{* ../../docs_src/body_updates/tutorial001_py310.py hl[28:33] *}
|
||
|
||
`PUT` використовується для отримання даних, які мають замінити чинні дані.
|
||
|
||
### Попередження про заміну { #warning-about-replacing }
|
||
|
||
Це означає, що якщо Ви хочете оновити елемент `bar`, використовуючи `PUT` з тілом:
|
||
|
||
```Python
|
||
{
|
||
"name": "Barz",
|
||
"price": 3,
|
||
"description": None,
|
||
}
|
||
```
|
||
|
||
оскільки він не містить вже збереженого атрибута `"tax": 20.2`, модель введення прийме значення за замовчуванням `"tax": 10.5`.
|
||
|
||
І дані будуть збережені з цим "новим" значенням `tax` = `10.5`.
|
||
|
||
## Часткові оновлення з `PATCH` { #partial-updates-with-patch }
|
||
|
||
Ви також можете використовувати операцію <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH" class="external-link" target="_blank">HTTP `PATCH`</a> для *часткового* оновлення даних.
|
||
|
||
Це означає, що Ви можете надіслати лише ті дані, які хочете оновити, залишаючи інші без змін.
|
||
|
||
/// note | Примітка
|
||
|
||
`PATCH` менш поширений і менш відомий, ніж `PUT`.
|
||
|
||
І багато команд використовують лише `PUT`, навіть для часткових оновлень.
|
||
|
||
Ви **вільні** використовувати їх так, як хочете, **FastAPI** не накладає жодних обмежень.
|
||
|
||
Але цей посібник показує вам, більш-менш, як їх задумано використовувати.
|
||
|
||
///
|
||
|
||
### Використання параметра `exclude_unset` у Pydantic { #using-pydantics-exclude-unset-parameter }
|
||
|
||
Якщо Ви хочете отримувати часткові оновлення, дуже корисно використовувати параметр `exclude_unset` у `.model_dump()` моделі Pydantic.
|
||
|
||
Наприклад: `item.model_dump(exclude_unset=True)`.
|
||
|
||
Це згенерує `dict` лише з тими даними, які були встановлені під час створення моделі `item`, виключаючи значення за замовчуванням.
|
||
|
||
Тоді Ви можете використовувати це, щоб згенерувати `dict` лише з даними, які були встановлені (надіслані у запиті), пропускаючи значення за замовчуванням:
|
||
|
||
{* ../../docs_src/body_updates/tutorial002_py310.py hl[32] *}
|
||
|
||
### Використання параметра `update` у Pydantic { #using-pydantics-update-parameter }
|
||
|
||
Тепер Ви можете створити копію наявної моделі за допомогою `.model_copy()`, і передати параметр `update` з `dict`, який містить дані для оновлення.
|
||
|
||
Наприклад: `stored_item_model.model_copy(update=update_data)`:
|
||
|
||
{* ../../docs_src/body_updates/tutorial002_py310.py hl[33] *}
|
||
|
||
### Підсумок часткових оновлень { #partial-updates-recap }
|
||
|
||
У підсумку, щоб застосувати часткові оновлення, Ви:
|
||
|
||
* (Опціонально) використовуєте `PATCH` замість `PUT`.
|
||
* Отримуєте збережені дані.
|
||
* Поміщаєте ці дані в модель Pydantic.
|
||
* Генеруєте `dict` без значень за замовчуванням з моделі введення (використовуючи `exclude_unset`).
|
||
* Таким чином Ви оновите лише ті значення, які були явно задані користувачем, замість того, щоб перезаписувати вже збережені значення значеннями за замовчуванням з вашої моделі.
|
||
* Створюєте копію збереженої моделі, оновлюючи її атрибути отриманими частковими оновленнями (використовуючи параметр `update`).
|
||
* Перетворюєте скопійовану модель на щось, що можна зберегти у вашу БД (наприклад, використовуючи `jsonable_encoder`).
|
||
* Це можна порівняти з повторним використанням методу `.model_dump()` моделі, але це гарантує (і перетворює) значення у типи даних, які можна перетворити на JSON, наприклад, `datetime` на `str`.
|
||
* Зберігаєте дані у вашу БД.
|
||
* Повертаєте оновлену модель.
|
||
|
||
{* ../../docs_src/body_updates/tutorial002_py310.py hl[28:35] *}
|
||
|
||
/// tip | Порада
|
||
|
||
Насправді Ви можете використовувати цю саму техніку і з операцією HTTP `PUT`.
|
||
|
||
Але приклад тут використовує `PATCH`, тому що він був створений для таких випадків.
|
||
|
||
///
|
||
|
||
/// note | Примітка
|
||
|
||
Зверніть увагу, що модель запиту все ще проходить валідацію.
|
||
|
||
Тож, якщо Ви хочете отримувати часткові оновлення, які можуть пропускати всі атрибути, Вам потрібно мати модель, де всі атрибути позначені як необов’язкові (зі значеннями за замовчуванням або `None`).
|
||
|
||
Щоб розрізняти моделі з усіма необов’язковими значеннями для **оновлення** і моделі з обов’язковими значеннями для **створення**, Ви можете скористатись ідеями, описаними у [Додаткові моделі](extra-models.md){.internal-link target=_blank}.
|
||
|
||
///
|