]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
🌐 Add Russian translation for `docs/tutorial/extra-models.md` (#9619)
authorivan-abc <36765187+ivan-abc@users.noreply.github.com>
Thu, 22 Jun 2023 16:14:16 +0000 (22:14 +0600)
committerGitHub <noreply@github.com>
Thu, 22 Jun 2023 16:14:16 +0000 (18:14 +0200)
Co-authored-by: Alexandr <alexandrhub@vk.com>
docs/ru/docs/tutorial/extra-models.md [new file with mode: 0644]
docs/ru/mkdocs.yml

diff --git a/docs/ru/docs/tutorial/extra-models.md b/docs/ru/docs/tutorial/extra-models.md
new file mode 100644 (file)
index 0000000..a346f74
--- /dev/null
@@ -0,0 +1,252 @@
+# Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ
+
+Π’ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΆΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΎ ΡΠ²ΡΠ·Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ ΡΠΎΠ±ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ.
+
+Π­Ρ‚ΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ Π² ΡΠ»ΡƒΡ‡Π°Π΅ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Сля, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ:
+
+* **МодСль Π΄Π»Ρ Π²Π²ΠΎΠ΄Π°** Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ.
+* **МодСль Π΄Π»Ρ Π²Ρ‹Π²ΠΎΠ΄Π°** Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ.
+* **МодСль Π΄Π»Ρ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…**, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ.
+
+!!! danger "Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅"
+    ΠΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚Π΅ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² Ρ‡ΠΈΡΡ‚ΠΎΠΌ Π²ΠΈΠ΄Π΅. Π’сСгда Ρ…Ρ€Π°Π½ΠΈΡ‚Π΅ "бСзопасный Ρ…ΡΡˆ", ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π·Π°Ρ‚Π΅ΠΌ ΡΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ.
+
+    Π•сли Π²Π°ΠΌ ΡΡ‚ΠΎ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ "Ρ…ΡΡˆ ΠΏΠ°Ρ€ΠΎΠ»Ρ" Π² [Π³Π»Π°Π²Π°Ρ… ΠΎ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΠΈ](security/simple-oauth2.md#password-hashing){.internal-link target=_blank}.
+
+## ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ
+
+НиТС ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π° ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ ΠΈΠ΄Π΅Ρ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΡ‚ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ ΠΏΠΎΠ»ΡΠΌΠΈ Π΄Π»Ρ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΠΈΡΠ°Π½Ρ‹ ΠΌΠ΅ΡΡ‚Π°, Π³Π΄Π΅ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ся:
+
+=== "Python 3.10+"
+
+    ```Python hl_lines="7  9  14  20  22  27-28  31-33  38-39"
+    {!> ../../../docs_src/extra_models/tutorial001_py310.py!}
+    ```
+
+=== "Python 3.6+"
+
+    ```Python hl_lines="9  11  16  22  24  29-30  33-35  40-41"
+    {!> ../../../docs_src/extra_models/tutorial001.py!}
+    ```
+
+### ΠŸΡ€ΠΎ `**user_in.dict()`
+
+#### `.dict()` ΠΈΠ· Pydantic
+
+`user_in` - ΡΡ‚ΠΎ Pydantic-модСль ΠΊΠ»Π°ΡΡΠ° `UserIn`.
+
+Π£ Pydantic-ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ `.dict()`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ `dict` Ρ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ.
+
+ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Π΅ΡΠ»ΠΈ ΠΌΡ‹ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Pydantic-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ `user_in` Ρ‚Π°ΠΊΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ:
+
+```Python
+user_in = UserIn(username="john", password="secret", email="john.doe@example.com")
+```
+
+ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ:
+
+```Python
+user_dict = user_in.dict()
+```
+
+Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ Π½Π°Ρ Π΅ΡΡ‚ΡŒ `dict` Ρ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ `user_dict` (это `dict` Π²ΠΌΠ΅ΡΡ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Pydantic-ΠΌΠΎΠ΄Π΅Π»ΠΈ).
+
+И Π΅ΡΠ»ΠΈ ΠΌΡ‹ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ:
+
+```Python
+print(user_dict)
+```
+
+ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ `dict` Ρ Ρ‚Π°ΠΊΠΈΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ:
+
+```Python
+{
+    'username': 'john',
+    'password': 'secret',
+    'email': 'john.doe@example.com',
+    'full_name': None,
+}
+```
+
+#### Π Π°ΡΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° `dict`
+
+Если ΠΌΡ‹ Π²ΠΎΠ·ΡŒΠΌΡ‘ΠΌ `dict` Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ `user_dict` ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ Π΅Π³ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (ΠΈΠ»ΠΈ ΠΊΠ»Π°ΡΡ), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ `**user_dict`, Python Ρ€Π°ΡΠΏΠ°ΠΊΡƒΠ΅Ρ‚ Π΅Π³ΠΎ. ΠžΠ½ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡΡ‚ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡ `user_dict` Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ‚ΠΈΠΏΠ° ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.
+
+ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ ΠΎΠΏΠΈΡΠ°Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ `user_dict`, Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:
+
+```Python
+UserInDB(**user_dict)
+```
+
+Π‘ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄:
+
+```Python
+UserInDB(
+    username="john",
+    password="secret",
+    email="john.doe@example.com",
+    full_name=None,
+)
+```
+
+Или, Π΅ΡΠ»ΠΈ Π΄Π»Ρ Π±ΠΎΠ»ΡŒΡˆΠ΅ΠΉ Ρ‚очности ΠΌΡ‹ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ `user_dict` Ρ Π»ΡŽΠ±Ρ‹ΠΌ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΡ‹ΠΌ, Ρ‚ΠΎ ΡΡ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:
+
+```Python
+UserInDB(
+    username = user_dict["username"],
+    password = user_dict["password"],
+    email = user_dict["email"],
+    full_name = user_dict["full_name"],
+)
+```
+
+#### Pydantic-модСль ΠΈΠ· ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ
+
+Как Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ `user_dict` ΠΈΠ· `user_in.dict()`, ΡΡ‚ΠΎΡ‚ ΠΊΠΎΠ΄:
+
+```Python
+user_dict = user_in.dict()
+UserInDB(**user_dict)
+```
+
+Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎΠ·Π½Π°Ρ‡Π΅Π½ Ρ‚Π°ΠΊΠΎΠΌΡƒ:
+
+```Python
+UserInDB(**user_in.dict())
+```
+
+...ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ `user_in.dict()` - ΡΡ‚ΠΎ `dict`, ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Python Π΅Π³ΠΎ "распаковал", ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ Π΅Π³ΠΎ Π² `UserInDB` ΠΈ ΡΡ‚Π°Π²ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌ `**`.
+
+Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Pydantic-модСль Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠΉ Pydantic-ΠΌΠΎΠ΄Π΅Π»ΠΈ.
+
+#### Π Π°ΡΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° `dict` ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹
+
+И Π·Π°Ρ‚Π΅ΠΌ, Π΅ΡΠ»ΠΈ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ `hashed_password=hashed_password` ΠΊΠ°ΠΊ Π·Π΄Π΅ΡΡŒ:
+
+```Python
+UserInDB(**user_in.dict(), hashed_password=hashed_password)
+```
+
+... Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅:
+
+```Python
+UserInDB(
+    username = user_dict["username"],
+    password = user_dict["password"],
+    email = user_dict["email"],
+    full_name = user_dict["full_name"],
+    hashed_password = hashed_password,
+)
+```
+
+!!! warning "ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅"
+    Π¦Π΅Π»ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ - Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π΄Π΅ΠΌΠΎΠ½ΡΡ‚рация Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Ρ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Π½ΠΎ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΎΠ½ΠΈ Π½Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π½Π°ΡΡ‚ΠΎΡΡ‰ΡƒΡŽ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ.
+
+## Π‘ΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚Π΅ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅
+
+Π‘ΠΎΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ΄Π° - ΡΡ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· Π³Π»Π°Π²Π½Ρ‹Ρ… ΠΈΠ΄Π΅ΠΉ **FastAPI**.
+
+ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ Ρ€ΠΈΡΠΊ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ Π±Π°Π³ΠΎΠ², ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒΡŽ, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π΄Π΅ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° (ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ‚Π΅ ΠΊΠΎΠ΄ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡ‚Π΅, Π½ΠΎ Π½Π΅ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ‚Π΅ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ), ΠΈ Ρ‚.Π΄.
+
+А Π²ΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Ρ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‚ Π½Π°Π·Π²Π°Π½ΠΈΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΈ Ρ‚ΠΈΠΏΠΎΠ².
+
+ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡ‚ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ.
+
+ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΡŒ `UserBase`, ΠΊΠΎΡ‚орая Π±ΡƒΠ΄Π΅Ρ‚ Π±Π°Π·ΠΎΠ²ΠΎΠΉ Π΄Π»Ρ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ. Π˜ Π·Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΡ‹ ΡΡ‚ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‘ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ (объявлСния Ρ‚ΠΈΠΏΠΎΠ², Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡŽ, ΠΈ Ρ‚.ΠΏ.).
+
+ВсС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΠΈ, Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ, Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, ΠΈ Ρ‚.ΠΏ. Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ.
+
+Π’ ΡΡ‚ΠΎΠΌ ΡΠ»ΡƒΡ‡Π°Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠΎΠ΄Π΅Π»ΡΠΌΠΈ (с `password` Π² Ρ‡ΠΈΡΡ‚ΠΎΠΌ Π²ΠΈΠ΄Π΅, Ρ `hashed_password` ΠΈ Π±Π΅Π· ΠΏΠ°Ρ€ΠΎΠ»Ρ):
+
+=== "Python 3.10+"
+
+    ```Python hl_lines="7  13-14  17-18  21-22"
+    {!> ../../../docs_src/extra_models/tutorial002_py310.py!}
+    ```
+
+=== "Python 3.6+"
+
+    ```Python hl_lines="9  15-16  19-20  23-24"
+    {!> ../../../docs_src/extra_models/tutorial002.py!}
+    ```
+
+## `Union` ΠΈΠ»ΠΈ `anyOf`
+
+Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ ΠΊΠ°ΠΊ `Union` ΠΈΠ· Π΄Π²ΡƒΡ… Ρ‚ΠΈΠΏΠΎΠ². Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· Π½ΠΈΡ….
+
+Он Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π² OpenAPI ΠΊΠ°ΠΊ `anyOf`.
+
+Для ΡΡ‚ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² Π² Python <a href="https://docs.python.org/3/library/typing.html#typing.Union" class="external-link" target="_blank">`typing.Union`</a>:
+
+!!! note "ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅"
+    ΠŸΡ€ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΠΈ <a href="https://pydantic-docs.helpmanual.io/usage/types/#unions" class="external-link" target="_blank">`Union`</a>, ΡΠ½Π°Ρ‡Π°Π»Π° ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΠΉΡ‚Π΅ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, Π·Π°Ρ‚Π΅ΠΌ ΠΌΠ΅Π½Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΈΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ `PlaneItem` ΡΡ‚ΠΎΠΈΡ‚ ΠΏΠ΅Ρ€Π΅Π΄ `CarItem` Π² `Union[PlaneItem, CarItem]`.
+
+=== "Python 3.10+"
+
+    ```Python hl_lines="1  14-15  18-20  33"
+    {!> ../../../docs_src/extra_models/tutorial003_py310.py!}
+    ```
+
+=== "Python 3.6+"
+
+    ```Python hl_lines="1  14-15  18-20  33"
+    {!> ../../../docs_src/extra_models/tutorial003.py!}
+    ```
+
+### `Union` Π² Python 3.10
+
+Π’ ΡΡ‚ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ `Union[PlaneItem, CarItem]` Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° `response_model`.
+
+ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ Π΅Π³ΠΎ ΠΊΠ°ΠΊ **Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°** Π²ΠΌΠ΅ΡΡ‚ΠΎ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² **Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠ°**, Π½Π°ΠΌ ΠΏΡ€ΠΈΠ΄Ρ‘тся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `Union` Π΄Π°ΠΆΠ΅ Π² Python 3.10.
+
+Если ΠΎΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ°, Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ‡Π΅Ρ€Ρ‚Ρƒ ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:
+
+```Python
+some_variable: PlaneItem | CarItem
+```
+
+Но Π΅ΡΠ»ΠΈ ΠΌΡ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π΅Π³ΠΎ Π² `response_model=PlaneItem | CarItem` ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Python ΠΏΠΎΠΏΡ‹Ρ‚аСтся ΠΏΡ€ΠΎΠΈΠ·Π²Π΅ΡΡ‚ΠΈ **Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ** ΠΌΠ΅ΠΆΠ΄Ρƒ `PlaneItem` ΠΈ `CarItem` Π²ΠΌΠ΅ΡΡ‚ΠΎ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚ΠΎ ΠΊΠ°ΠΊ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠ°.
+
+## Π‘писок ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ
+
+Π’Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ ΠΊΠ°ΠΊ ΡΠΏΠΈΡΠΊΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².
+
+Для ΡΡ‚ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `typing.List` ΠΈΠ· ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Python (ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΡΡ‚ΠΎ `list` Π² Python 3.9 ΠΈ Π²Ρ‹ΡˆΠ΅):
+
+=== "Python 3.9+"
+
+    ```Python hl_lines="18"
+    {!> ../../../docs_src/extra_models/tutorial004_py39.py!}
+    ```
+
+=== "Python 3.6+"
+
+    ```Python hl_lines="1  20"
+    {!> ../../../docs_src/extra_models/tutorial004.py!}
+    ```
+
+## ΠžΡ‚Π²Π΅Ρ‚ Ρ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ `dict`
+
+Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ΄Π½ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ `dict` ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΈΠΏΡ‹ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π±Π΅Π· ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΡ Pydantic-ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ.
+
+Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Π΅ΡΠ»ΠΈ Π²Ρ‹ Π·Π°Ρ€Π°Π½Π΅Π΅ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Ρ… Π½Π°Π·Π²Π°Π½ΠΈΠΉ ΠΏΠΎΠ»Π΅ΠΉ/Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π½ΡƒΠΆΠ½Ρ‹ ΠΏΡ€ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Pydantic-ΠΌΠΎΠ΄Π΅Π»ΠΈ).
+
+Π’ ΡΡ‚ΠΎΠΌ ΡΠ»ΡƒΡ‡Π°Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `typing.Dict` (ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΡΡ‚ΠΎ `dict` Π² Python 3.9 ΠΈ Π²Ρ‹ΡˆΠ΅):
+
+=== "Python 3.9+"
+
+    ```Python hl_lines="6"
+    {!> ../../../docs_src/extra_models/tutorial005_py39.py!}
+    ```
+
+=== "Python 3.6+"
+
+    ```Python hl_lines="1  8"
+    {!> ../../../docs_src/extra_models/tutorial005.py!}
+    ```
+
+## Π Π΅Π·ΡŽΠΌΠ΅
+
+Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΎ Pydantic-ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠΉΡ‚Π΅ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ….
+
+Π’Π°ΠΌ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΅Π΄ΠΈΠ½ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΌΠΎΠ΄Π΅Π»ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΠΈ, Π΅ΡΠ»ΠΈ ΡΡ‚Π° ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π±Ρ‹Ρ‚ΡŒ Π² Ρ€Π°Π·Π½Ρ‹Ρ… "состояниях". ΠšΠ°ΠΊ Π² ΡΠ»ΡƒΡ‡Π°Π΅ Ρ "ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒΡŽ" ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Сля, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ ΡΠΎΡΡ‚ояния Ρ ΠΏΠΎΠ»ΡΠΌΠΈ `password`, `password_hash` ΠΈ Π±Π΅Π· ΠΏΠ°Ρ€ΠΎΠ»Ρ.
index 7b8e351f8d1684ebfa29153abec0f73a9ffcb023..24ab157268f436f1935ebd2e783438714219d6a6 100644 (file)
@@ -77,6 +77,7 @@ nav:
   - tutorial/extra-data-types.md
   - tutorial/cookie-params.md
   - tutorial/testing.md
+  - tutorial/extra-models.md
   - tutorial/response-status-code.md
   - tutorial/query-params.md
   - tutorial/body-multiple-params.md