# Тіло — Оновлення { #body-updates }

## Оновлення із заміною за допомогою `PUT` { #update-replacing-with-put }

Щоб оновити елемент, ви можете використати [HTTP `PUT`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT) операцію.

Ви можете використати `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 }

Ви також можете використовувати операцію [HTTP `PATCH`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) для *часткового* оновлення даних.

Це означає, що Ви можете надіслати лише ті дані, які хочете оновити, залишаючи інші без змін.

/// 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).

///
