|
| 1 | +# Тіло – Оновлення |
| 2 | + |
| 3 | +## Оновлення з використанням `PUT` |
| 4 | + |
| 5 | +Щоб оновити елемент, Ви можете використати <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT" class="external-link" target="_blank">HTTP `PUT`</a> операцію. |
| 6 | + |
| 7 | +Ви можете використати `jsonable_encoder`, щоб перетворити вхідні дані на такі, які можна зберігати як JSON (наприклад, у NoSQL базі даних). Наприклад, перетворюючи `datetime` у `str`. |
| 8 | + |
| 9 | +{* ../../docs_src/body_updates/tutorial001_py310.py hl[28:33] *} |
| 10 | + |
| 11 | +`PUT` використовується для отримання даних, які мають замінити чинні дані. |
| 12 | + |
| 13 | +### Попередження про заміну |
| 14 | + |
| 15 | +Це означає, що якщо Ви хочете оновити елемент `bar`, використовуючи `PUT` з тілом: |
| 16 | + |
| 17 | +```Python |
| 18 | +{ |
| 19 | + "name": "Barz", |
| 20 | + "price": 3, |
| 21 | + "description": None, |
| 22 | +} |
| 23 | +``` |
| 24 | + |
| 25 | +оскільки він не містить вже збереженого атрибута `"tax": 20.2`, модель введення прийме значення за замовчуванням `"tax": 10.5`. |
| 26 | + |
| 27 | +І дані будуть збережені з цим "новим" значенням `tax` = `10.5`. |
| 28 | + |
| 29 | +## Часткові оновлення з `PATCH` |
| 30 | + |
| 31 | +Ви також можете використовувати операцію <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH" class="external-link" target="_blank">HTTP `PATCH`</a> для *часткового* оновлення даних. |
| 32 | + |
| 33 | +Це означає, що Ви можете надіслати лише ті дані, які хочете оновити, залишаючи інші без змін. |
| 34 | + |
| 35 | +/// note | Примітка |
| 36 | + |
| 37 | +`PATCH` менш відомий і рідше використовується, ніж `PUT`. |
| 38 | + |
| 39 | +І багато команд використовують лише `PUT`, навіть для часткових оновлень. |
| 40 | + |
| 41 | +Ви **вільні** використовувати їх так, як хочете, **FastAPI** не накладає обмежень. |
| 42 | + |
| 43 | +Але цей посібник показує Вам більш-менш як їх задумано використовувати. |
| 44 | + |
| 45 | +/// |
| 46 | + |
| 47 | +### Використання параметра `exclude_unset` у Pydantic |
| 48 | + |
| 49 | +Якщо Ви хочете отримати часткові оновлення, дуже зручно використовувати параметр `exclude_unset` у методі `.model_dump()` моделі Pydantic. |
| 50 | + |
| 51 | +Наприклад: `item.model_dump(exclude_unset=True)`. |
| 52 | + |
| 53 | +/// info | Інформація |
| 54 | + |
| 55 | +У Pydantic v1 цей метод називався `.dict()`, він був застарілий (але все ще підтримується) у Pydantic v2, і був перейменований у `.model_dump()`. |
| 56 | + |
| 57 | +Приклади тут використовують `.dict()` для сумісності з Pydantic v1, але Вам слід використовувати `.model_dump()`, якщо можете використовувати Pydantic v2. |
| 58 | + |
| 59 | +/// |
| 60 | + |
| 61 | +Це створить `dict` лише з тими даними, які були явно встановлені під час створення моделі `item`, виключаючи значення за замовчуванням. |
| 62 | + |
| 63 | +Тоді Ви можете використовувати це, щоб створити `dict` лише з даними, які були встановлені (надіслані у запиті), пропускаючи значення за замовчуванням: |
| 64 | + |
| 65 | +{* ../../docs_src/body_updates/tutorial002_py310.py hl[32] *} |
| 66 | + |
| 67 | +### Використання параметра `update` у Pydantic |
| 68 | + |
| 69 | +Тепер Ви можете створити копію наявної моделі за допомогою `.model_copy()`, і передати параметр `update` з `dict` , який містить дані для оновлення. |
| 70 | + |
| 71 | +/// info | Інформація |
| 72 | + |
| 73 | +У Pydantic v1 метод називався `.copy()`, він був застарілий (але все ще підтримується) у Pydantic v2, і був перейменований у `.model_copy()`. |
| 74 | + |
| 75 | +Приклади тут використовують `.copy()` для сумісності з Pydantic v1, але якщо Ви можете використовувати Pydantic v2 — Вам слід використовувати `.model_copy()` замість цього. |
| 76 | + |
| 77 | +/// |
| 78 | + |
| 79 | +Наприклад: `stored_item_model.model_copy(update=update_data)`: |
| 80 | + |
| 81 | +{* ../../docs_src/body_updates/tutorial002_py310.py hl[33] *} |
| 82 | + |
| 83 | +### Підсумок часткових оновлень |
| 84 | + |
| 85 | +У підсумку, щоб застосувати часткові оновлення, Ви: |
| 86 | + |
| 87 | +* (Опціонально) використовуєте `PATCH` замість `PUT`. |
| 88 | +* Отримуєте збережені дані. |
| 89 | +* Поміщаєте ці дані в модель Pydantic. |
| 90 | +* Генеруєте `dict` без значень за замовчуванням з моделі введення (використовуючи `exclude_unset`). |
| 91 | + * Таким чином Ви оновите лише ті значення, які були явно задані користувачем, замість того, щоб перезаписувати вже збережені значення значеннями за замовчуванням з вашої моделі. |
| 92 | +* Створюєте копію збереженої моделі, оновлюючи її атрибути отриманими частковими оновленнями (використовуючи параметр `update`). |
| 93 | +* Перетворюєте скопійовану модель на щось, що можна зберегти у вашу БД (наприклад, використовуючи `jsonable_encoder`). |
| 94 | + * Це можна порівняти з повторним використанням методу `.model_dump()` моделі, але це гарантує (і перетворює) значення у типи даних, які можна перетворити на JSON, наприклад, `datetime` на `str`. |
| 95 | +* Зберігаєте дані у вашу БД. |
| 96 | +* Повертаєте оновлену модель. |
| 97 | + |
| 98 | +{* ../../docs_src/body_updates/tutorial002_py310.py hl[28:35] *} |
| 99 | + |
| 100 | +/// tip | Порада |
| 101 | + |
| 102 | +Насправді Ви можете використовувати цю саму техніку і з операцією HTTP `PUT`. |
| 103 | + |
| 104 | +Але приклад тут використовує `PATCH`, тому що він був створений саме для таких випадків. |
| 105 | + |
| 106 | +/// |
| 107 | + |
| 108 | +/// note | Примітка |
| 109 | + |
| 110 | +Зверніть увагу, що модель запиту все ще проходить валідацію. |
| 111 | + |
| 112 | +Тож, якщо Ви хочете отримувати часткові оновлення, які можуть не містити жодного атрибута, Вам потрібно мати модель, де всі атрибути позначені як необов’язкові (зі значеннями за замовчуванням або `None`). |
| 113 | + |
| 114 | +Щоб розрізняти моделі з усіма необов’язковими значеннями для **оновлення** і моделі з обов’язковими значеннями для **створення**, Ви можете скористатись ідеями, описаними у [Додаткові моделі](extra-models.md){.internal-link target=_blank}. |
| 115 | + |
| 116 | +/// |
0 commit comments