Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com>
6.8 KiB
Тіло — Оновлення
Оновлення із заміною за допомогою PUT
Щоб оновити елемент, ви можете використати HTTP PUT операцію.
Ви можете використати jsonable_encoder, щоб перетворити вхідні дані на такі, які можна зберігати як JSON (наприклад, у NoSQL базі даних). Наприклад, перетворюючи datetime у str.
{* ../../docs_src/body_updates/tutorial001_py310.py hl[28:33] *}
PUT використовується для отримання даних, які мають замінити чинні дані.
Попередження про заміну
Це означає, що якщо Ви хочете оновити елемент bar, використовуючи PUT з тілом:
{
"name": "Barz",
"price": 3,
"description": None,
}
оскільки він не містить вже збереженого атрибута "tax": 20.2, модель введення прийме значення за замовчуванням "tax": 10.5.
І дані будуть збережені з цим "новим" значенням tax = 10.5.
Часткові оновлення з PATCH
Ви також можете використовувати операцію HTTP PATCH для часткового оновлення даних.
Це означає, що Ви можете надіслати лише ті дані, які хочете оновити, залишаючи інші без змін.
/// note | Примітка
PATCH менш поширений і менш відомий, ніж PUT.
І багато команд використовують лише PUT, навіть для часткових оновлень.
Ви вільні використовувати їх так, як хочете, FastAPI не накладає жодних обмежень.
Але цей посібник показує вам, більш-менш, як їх задумано використовувати.
///
Використання параметра exclude_unset у Pydantic
Якщо Ви хочете отримувати часткові оновлення, дуже корисно використовувати параметр 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
Тепер Ви можете створити копію наявної моделі за допомогою .model_copy(), і передати параметр update з dict, який містить дані для оновлення.
Наприклад: stored_item_model.model_copy(update=update_data):
{* ../../docs_src/body_updates/tutorial002_py310.py hl[33] *}
Підсумок часткових оновлень
У підсумку, щоб застосувати часткові оновлення, Ви:
- (Опціонально) використовуєте
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).
Щоб розрізняти моделі з усіма необов’язковими значеннями для оновлення і моделі з обов’язковими значеннями для створення, Ви можете скористатись ідеями, описаними у Додаткові моделі{.internal-link target=_blank}.
///