Skip to content

Commit 6c14328

Browse files
valentinDruzhininValentyn Druzhyninpre-commit-ci[bot]
authored
🌐 Add Ukrainian translation for docs/uk/docs/tutorial/body-updates.md (fastapi#13804)
* 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/body-updates.md * 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks --------- Co-authored-by: Valentyn Druzhynin <v.druzhynin@zakaz.global> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent ebdeda2 commit 6c14328

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed

docs/uk/docs/tutorial/body-updates.md

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
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

Comments
 (0)