Files
SecondBrain/.obsidian/workspace.json
T
2026-05-31 10:18:48 +03:00

294 lines
114 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"main": {
"id": "5324373015726ba8",
"type": "split",
"children": [
{
"id": "4334af5869448aa1",
"type": "tabs",
"children": [
{
"id": "28d74d490ab22900",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "90 Library/Programming/Python/Django: Работа с формами и CUD.md",
"mode": "preview",
"source": false,
"backlinks": false
},
"icon": "lucide-file",
"title": "Django: Работа с формами и CUD"
}
}
]
}
],
"direction": "vertical"
},
"left": {
"id": "a9c2d5e65288011a",
"type": "split",
"children": [
{
"id": "383cca303cf4b57d",
"type": "tabs",
"children": [
{
"id": "27e6486165131cfa",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": true
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "66079465678173e5",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "tag:#gym",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "c2541ce190da912e",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
},
{
"id": "673ce6e6c09cfc9c",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "Tags"
}
}
]
}
],
"direction": "horizontal",
"width": 233,
"collapsed": true
},
"right": {
"id": "38c591aa0966839e",
"type": "split",
"children": [
{
"id": "86a193b1d3159ff8",
"type": "tabs",
"children": [
{
"id": "06940eb960fc1db5",
"type": "leaf",
"pinned": true,
"state": {
"type": "terminal:terminal",
"state": {
"terminal:terminal": {
"cwd": "/home/ada/Documents/Vaults/SecondBrain",
"focus": false,
"profile": {
"args": [
"--login"
],
"executable": "/usr/bin/zsh",
"followTheme": true,
"name": "ZSH",
"platforms": {
"darwin": false,
"linux": true
},
"pythonExecutable": "python3",
"restoreHistory": true,
"rightClickAction": "copyPaste",
"successExitCodes": [
"0",
"SIGINT",
"SIGTERM"
],
"terminalOptions": {
"fontFamily": "FiraCode Nerd Font Mono",
"documentOverride": null
},
"type": "integrated",
"useWin32Conhost": false
},
"profileSourceId": "7004edff-76db-412f-95d3-5fd8e180d055",
"serial": {
"columns": 44,
"data": "\r\n\u001b[2m│ >_ \u001b[1;22mOpenAI Codex\u001b[22;2m (v0.135.0)\r\n│\r\n│\r\n│\r\n│ model: \u001b[0mgpt-5.5 medium\u001b[2m \u001b[36;22m/model\u001b[39;2m to\r\nchange │\r\n│ directory: \u001b[0m~/…/Vaults/SecondBrain\r\n\u001b[2m│\r\n╰───────────────────────────────────────────\r\n───╯\r\n\r\n\u001b[0m \u001b[1mTip:\u001b[0m Use /mcp to list configured MCP\r\n tools.\r\n\r\n\u001b[48;5;238m\u001b[44X\r\n\u001b[1;2m \u001b[22;22m\"90 Library/Programming/Python/Django:\u001b[4X\r\n Модели и ORM.md\" в типах полей пропиши\u001b[4X\r\n для каждого типа маленькое пояснение\u001b[6X\r\n\u001b[44X\r\n\u001b[0m\r\n\u001b[2m• \u001b[0mПлан: прочитаю заметку и шаблон/соседний\r\n стиль, затем точечно допишу короткие\r\n пояснения в разделе типов полей без\r\n изменения остальной структуры.\r\n\r\n\u001b[2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m INDEX.md\u001b[2m, \u001b[0mDjango: Модели и ORM.md\r\n\r\n\u001b[32;1m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mn\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"типы полей|Field|\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mCharField|TextField|IntegerField\"\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'90\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mLibrary/Programming'\r\n\u001b[39;2m └ 11 matches in 1F:\r\n … +20 lines (ctrl + t to view\r\n transcript)\r\n\u001b[0m \u001b[2mLookups)\r\n\r\n\r\n────────────────────────────────────────────\r\n\r\n• \u001b[0mНашёл нужный раздел: сейчас типы полей\r\n перечислены группами, у \u001b[36mAutoField\r\n\u001b[0m пояснение пустое. Внесу только короткие\r\n пояснения и переведу статус заметки в\r\n \u001b[36mprocessing\u001b[0m, потому что файл редактируется.\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 90 Library/Programming/Python/\r\nDjango: Модели и ORM.md (\u001b[32m+12\u001b[0m \u001b[31m-6\u001b[0m)\r\n \u001b[2m 1 \u001b[0m \u001b[38;2;147;153;178m---\r\n\u001b[39;48;5;52m \u001b[2m 2 \u001b[31;22m-\u001b[38;2;205;214;244;2mstatus: seed\u001b[24X\r\n\u001b[39;48;5;22;22m \u001b[2m 2 \u001b[32;22m+\u001b[38;2;205;214;244mstatus: processing\u001b[18X\r\n\u001b[0m \u001b[2m 3 \u001b[0m \u001b[38;2;205;214;244mtype: concept\u001b[23X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m35 \u001b[0m \u001b[38;2;147;153;178m###\u001b[38;2;249;226;175m \u001b[38;2;148;226;213mТипы полей\r\n\u001b[39;48;5;52m \u001b[2m36 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mAutoField\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m -\u001b[21X\r\n\u001b[39;22m \u001b[2m37 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mCharField(max_length=N)\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m, \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mTextFi\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244meld\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39;22m \u001b[2m38 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mIntegerField\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m, \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mDecimalField(max_\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mdigits, decimal_places)\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39;22m \u001b[2m39 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mBooleanField\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m, \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mDateField\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m, \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mDate\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mTimeField\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39;22m \u001b[2m40 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mEmailField\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m, \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mFileField\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m, \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mImageF\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mield\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39;48;5;22;22m \u001b[2m36 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mAutoField\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — автоинкрементный чис\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mловой первичный ключ.\r\n\u001b[39m \u001b[2m37 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mCharField(max_length=N)\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — коротк\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mая строка фиксированной максимальной\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m длины.\r\n\u001b[39m \u001b[2m38 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mTextField\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — длинный текст без об\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mязательного ограничения длины.\r\n\u001b[39m \u001b[2m39 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mIntegerField\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — целое число.\r\n\u001b[39m \u001b[2m40 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mDecimalField(max_digits, decimal_\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mие \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mTrue\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m/\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mFalse\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39m \u001b[2m42 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mDateField\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — дата без времени.\r\n\u001b[39m \u001b[2m43 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mDateTimeField\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — дата и время.\r\n\u001b[39m \u001b[2m44 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mEmailField\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — строка с валидацией\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m email-адреса.\r\n\u001b[39m \u001b[2m45 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mFileField\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — путь к загруженному\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mфайлу.\r\n\u001b[39m \u001b[2m46 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mImageField\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — файл изображения с\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mдополнительной проверкой формата.\r\n\u001b[0m \u001b[2m47\u001b[38X\r\n\r\n\u001b[32;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mn\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"Django: Модели и ORM|\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mDjango Модели\"\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'99 System/INDEX.md'\r\n\u001b[39;2m └ 1 matches in 1F:\r\n\r\n … +3 lines (ctrl + t to view transcript)\r\n\u001b[0m \u001b[2mbackend, or...\r\n\r\n• \u001b[0mТак как изменился frontmatter, обновляю\r\n соответствующую строку в индексе, без\r\n полной регенерации всего файла.\r\n\r\n\u001b[2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m INDEX.md\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 99 System/INDEX.md (\u001b[32m+1\u001b[0m \u001b[31m-1\u001b[0m)\r\n \u001b[2m523 \u001b[0m \u001b[38;2;147;153;178m|\u001b[38;2;205;214;244m---------\u001b[38;2;147;153;178m|\u001b[38;2;205;214;244m-------\u001b[38;2;147;153;178m|\u001b[38;2;205;214;244m--------\u001b[38;2;147;153;178m|\u001b[38;2;205;214;244m------\u001b[38;2;147;153;178m|\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m------\u001b[38;2;147;153;178m|\r\n\u001b[39;48;5;52m \u001b[2m524 \u001b[31;22m-\u001b[38;2;147;153;178;2m|\u001b[38;2;205;214;244m [[Django\u001b[38;2;147;153;178m:\u001b[38;2;205;214;244m Модели и ORM]] \u001b[38;2;147;153;178m|\u001b[38;2;205;214;244m Django\r\n\u001b[39;22m \u001b[2m \u001b[38;2;147;153;178m:\u001b[38;2;205;214;244m Модели и ORM \u001b[38;2;147;153;178m|\u001b[38;2;205;214;244m seed \u001b[38;2;147;153;178m|\u001b[38;2;205;214;244m concept \u001b[38;2;147;153;178m|\u001b[38;2;205;214;244m [\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mdjango, backend, orm, database, mig\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mrations] \u001b[38;2;147;153;178m|\r\n\u001b[39;48;5;22;22m \u001b[2m524 \u001b[32;22m+\u001b[38;2;147;153;178m|\u001b[38;2;205;214;244m [[Django: Модели и ORM]] \u001b[38;2;147;153;178m|\u001b[38;2;205;214;244m Django\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m: Модели и ORM \u001b[38;2;147;153;178m|\u001b[38;2;205;214;244m processing \u001b[38;2;147;153;178m|\u001b[38;2;205;214;244m conce\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mpt \u001b[38;2;147;153;178m|\u001b[38;2;205;214;244m [django, backend, orm, databas\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22me, migrations] \u001b[38;2;147;153;178m|\r\n\u001b[0m \u001b[2m525 \u001b[0m \u001b[38;2;147;153;178m|\u001b[38;2;205;214;244m [[Django: Представления, шаблоны\u001b[1X\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mблоны и CBV \u001b[38;2;147;153;178m|\u001b[38;2;205;214;244m seed \u001b[38;2;147;153;178m|\u001b[38;2;205;214;244m concept \u001b[38;2;147;153;178m|\u001b[38;2;205;214;244m [dja\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mngo, routing, templates, cbv, fbv]\r\n\u001b[0m \u001b[2m \u001b[38;2;147;153;178;22m|\r\n\r\n\r\n\u001b[32;1m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m git diff\u001b[38;2;148;226;213m --\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'90 Library/\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mProgramming/Python/Django: Модели и\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mORM.md'\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'99 System/INDEX.md'\r\n\u001b[39;2m └ .../Programming/Python/Django: Модели и\r\n\u001b[0m \u001b[2m +1 -1\r\n\r\n────────────────────────────────────────────\r\n\r\n• \u001b[0mГотово.\r\n\r\n В \u001b[36m90 Library/Programming/Python/Django:\r\n\u001b[0m \u001b[36mМодели и ORM.md:35\u001b[0m в разделе «Типы полей»\r\n добавил короткое пояснение для каждого\r\n типа поля. Статус заметки перевёл в\r\n \u001b[36mprocessing\u001b[0m и обновил строку в \u001b[36m99 System/\r\n\u001b[0m \u001b[36mINDEX.md:524\u001b[0m.\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n\u001b[48;5;238;22m\u001b[44X\r\n\u001b[1;2m \u001b[22;22mотношения тоже распиши, касательно,\r\n `on_delete'\r\n\r\n\u001b[0m\u001b[44X\r\n\u001b[2m• \u001b[0mПлан: расширю только блок «Отношения»:\r\n коротко поясню каждый тип связи и распишу\r\n варианты \u001b[36mon_delete\u001b[0m без затрагивания\r\n остальных разделов.\r\n\r\n\u001b[2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Модели и ORM.md\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n• \u001b[0mРедактирую этот небольшой блок: оставляю\r\n формат списка, добавляю смысл \u001b[36mon_delete\u001b[0m и\r\n отмечаю, что для \u001b[36mSET_NULL\u001b[0m нужно \u001b[36mnull=True\u001b[0m,\r\n а для \u001b[36mSET_DEFAULT\u001b[0m нужен \u001b[36mdefault\u001b[0m.\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 90 Library/Programming/Python/\r\nDjango: Модели и ORM.md (\u001b[32m+10\u001b[0m \u001b[31m-4\u001b[0m)\r\n \u001b[2m48 \u001b[0m \u001b[38;2;147;153;178m###\u001b[38;2;249;226;175m \u001b[38;2;148;226;213mОтношения\r\n\u001b[39;48;5;52m \u001b[2m49 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mForeignKey(Target, on_delete=mode\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mls.CASCADE)\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — Один ко многим.\r\n\u001b[39;22m \u001b[2m50 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mOneToOneField(Target, on_delete=m\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244models.CASCADE)\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — Один к одному.\r\n\u001b[39;22m \u001b[2m51 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mManyToManyField(Target)\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — Многие\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244m ко многим.\r\n\u001b[39;22m \u001b[2m52 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**\u001b[38;2;243;139;168;1mon_delete:\u001b[38;2;147;153;178;22m**\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mCASCADE\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m, \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mPROTECT\r\n\u001b[39;22m \u001b[2m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m, \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mSET_NULL\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m, \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mSET_DEFAULT\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m, \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mDO_NO\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mTHING\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39;48;5;22;22m \u001b[2m49 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mForeignKey(Target, on_delete=...)\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m`\u001b[38;2;205;214;244m — связь «один ко многим»: у одной\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m..)\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — связь «один к одному»: каждой\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m записи соответствует максимум одна\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mсвязанная запись.\r\n\u001b[39m \u001b[2m51 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mManyToManyField(Target)\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — связь\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m«многие ко многим»: записи обеих мод\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mелей могут ссылаться на несколько за\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mписей другой модели.\r\n\u001b[39m \u001b[2m52 \u001b[32;22m+\r\n\u001b[39m \u001b[2m53 \u001b[32;22m+\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mon_delete\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m задаёт, что делать с тек\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mущей записью, если удаляется связанн\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mая запись \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mTarget\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m:\r\n\u001b[39m \u001b[2m54 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mCASCADE\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — удалить текущую запись\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m вместе со связанной.\r\n\u001b[39m \u001b[2m55 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mPROTECT\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — запретить удаление свя\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mзанной записи, пока на неё есть ссыл\r\n\u001b[39m \u001b[2m56 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mSET_NULL\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — записать \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mNULL\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m в пол\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mе связи; требует \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mnull=True\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39m \u001b[2m57 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mSET_DEFAULT\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — записать значение\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпо умолчанию; требует \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mdefault\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mётся на БД и разработчике.\r\n\u001b[0m \u001b[2m59\u001b[38X\r\n\r\n•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Модели и ORM.md\r\n\u001b[2m │ \u001b[38;2;166;227;161;22mORM.md'\r\n\u001b[39;2m └\r\n\r\n────────────────────────────────────────────\r\n\r\n• \u001b[0mГотово.\r\n\r\n В \u001b[36m90 Library/Programming/Python/Django:\r\n\u001b[0m \u001b[36mМодели и ORM.md:48\u001b[0m расписал отношения и\r\n отдельно пояснил варианты \u001b[36mon_delete\u001b[0m:\r\n \u001b[36mCASCADE\u001b[0m, \u001b[36mPROTECT\u001b[0m, \u001b[36mSET_NULL\u001b[0m, \u001b[36mSET_DEFAULT\u001b[0m,\r\n \u001b[36mDO_NOTHING\u001b[0m.\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n\u001b[48;5;238;22m\u001b[44X\r\n\u001b[1;2m \u001b[22;22mРаспиши простым языком Оптимизацию,\r\n Агрегацию и Логические условия\r\n\r\n\u001b[0m\u001b[44X\r\n\u001b[2m• \u001b[0mПлан: прочитаю три нужных блока, затем\r\n перепишу их простым языком без добавления\r\n новых тем и без изменения остальной\r\n заметки.\r\n\r\n\u001b[2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Модели и ORM.md\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n• \u001b[0mНашёл компактные формулировки. Расширю их\r\n до объяснения «зачем это нужно» и коротких\r\n примеров, чтобы осталось учебной заметкой,\r\n а не справочником API.\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 90 Library/Programming/Python/\r\nDjango: Модели и ORM.md (\u001b[32m+14\u001b[0m \u001b[31m-7\u001b[0m)\r\n \u001b[2m 89 \u001b[0m \u001b[38;2;147;153;178m###\u001b[38;2;249;226;175m \u001b[38;2;148;226;213mОптимизация запросов\r\n\u001b[39;48;5;52m \u001b[2m 90 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mselect_related('field')\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m: INNER\u001b[1X\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mJOIN для ForeignKey и OneToOne.\r\n\u001b[39;22m \u001b[2m 91 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mprefetch_related('field')\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m: 2-й\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mзапрос для ManyToMany и обратных св\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mязей.\r\n\u001b[39;22m \u001b[2m 92 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**\u001b[38;2;243;139;168;1mПроблема N+1:\u001b[38;2;147;153;178;22m**\u001b[38;2;205;214;244m Возникает при о\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mбращении к связанным полям в цикле\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mбез предварительной подгрузки.\r\n\u001b[39;48;5;22;22m \u001b[2m 90 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mselect_related('field')\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — заран\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mее подтягивает связанную запись чер\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mез \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mJOIN\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m. Подходит для \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mForeignKey\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m`\u001b[38;2;205;214;244m и \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mOneToOneField\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m, когда у объект\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mа есть одна связанная запись.\r\n\u001b[39m \u001b[2m 91 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mprefetch_related('field')\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — дел\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mает отдельный запрос за связанными\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mобъектами и собирает их в Python. П\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mодходит для \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mManyToManyField\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m и обр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mатных связей, где связанных записей\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m может быть много.\r\n\u001b[39m \u001b[2m 92 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m**\u001b[38;2;243;139;168;1mПроблема N+1\u001b[38;2;147;153;178;22m**\u001b[38;2;205;214;244m — ситуация, когд\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mа Django делает один запрос за спис\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mком объектов, а потом ещё по одному\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m запросу на каждый объект в цикле.\r\n\u001b[39m \u001b[2m 93 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 94 \u001b[32;22m+\u001b[38;2;205;214;244mПример: если вывести 100 книг и для\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m каждой обратиться к \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mbook.author\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m без оптимизации может получиться 1\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m01 запрос. С \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mselect_related('autho\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mr')\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m авторы будут загружены сразу.\r\n\u001b[0m \u001b[2m 95\u001b[37X\r\n\u001b[0m \u001b[2m 96 \u001b[0m \u001b[38;2;147;153;178m###\u001b[38;2;249;226;175m \u001b[38;2;148;226;213mАгрегация и аннотация\r\n\u001b[39;48;5;52m \u001b[2m 95 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244maggregate(Avg('rating'))\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m: терми\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mнальный метод, возвращает словарь.\r\n\u001b[39;22m \u001b[2m 96 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mannotate(total=Count('entries'))\r\n\u001b[39;22m \u001b[2m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m: добавляет вычисляемое поле к каж\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mдому объекту в выборке.\r\n\u001b[39;48;5;22;22m \u001b[2m 97 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244maggregate(Avg('rating'))\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — счит\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mает одно итоговое значение по всей\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mвыборке: среднее, сумму, минимум, м\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mаксимум, количество. Возвращает сло\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mварь, а не QuerySet.\r\n\u001b[39m \u001b[2m 98 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mannotate(total=Count('entries'))\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m`\u001b[38;2;205;214;244m — добавляет вычисляемое поле к ка\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mждому объекту в выборке.\r\n\u001b[39m \u001b[2m 99 \u001b[32;22m+\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22me(total=Count('books'))\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m добавит ка\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mждому автору поле \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mtotal\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m с количес\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mтвом его книг.\r\n\u001b[0m \u001b[2m101\u001b[37X\r\n\u001b[0m \u001b[2m102 \u001b[0m \u001b[38;2;147;153;178m###\u001b[38;2;249;226;175m \u001b[38;2;148;226;213mЛогические условия\r\n\u001b[39;48;5;52m \u001b[2m 99 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mQ-объекты\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m: Позволяют использова\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mть \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mOR\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m (\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m|\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m), \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mAND\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m (\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m&\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m), \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mNOT\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m (\r\n\u001b[39;22m \u001b[2m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m~\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m).\r\n\u001b[39;22m \u001b[2m100 \u001b[31;22m-\u001b[38;2;147;153;178;2m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mF-выражения\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m: Ссылки на поля в Б\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mД (атомарные операции без Race Cond\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mition).\r\n\u001b[39;48;5;22;22m \u001b[2m103 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mQ-объекты\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m нужны для сложных усл\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mовий в \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mfilter()\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m: \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mOR\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m (\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m|\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m), \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mAND\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m`\u001b[38;2;205;214;244m (\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m&\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m), \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mNOT\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m (\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m~\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m).\r\n\u001b[39m \u001b[2m104 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mF-выражения\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m позволяют сравниват\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mь и изменять поля прямо на стороне\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mБД, не загружая значение в Python.\r\n\u001b[39m \u001b[2m105 \u001b[32;22m+\r\n\u001b[39m \u001b[2m106 \u001b[32;22m+\u001b[38;2;205;214;244mПример \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mQ\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m: найти книги, где рейтин\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mг выше 4 или название содержит \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mDja\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mngo\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39m \u001b[2m107 \u001b[32;22m+\u001b[38;2;205;214;244mПример \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mF\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m: увеличить счётчик просм\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mотров на 1 прямо в БД: \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mviews = F('\r\n\u001b[0m\u001b[44X\r\n\u001b[2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Модели и ORM.md\r\n\r\n\u001b[2m │ \u001b[38;2;166;227;161;22mORM.md'\r\n\u001b[39;2m └ .../Programming/Python/Django: Модели и\r\n … +38 lines (ctrl + t to view\r\n transcript)\r\n\u001b[0m \u001b[2mF('views') + 1`.\r\n\r\n• \u001b[0mГотово.\r\n\r\n В \u001b[36m90 Library/Programming/Python/Django:\r\n\u001b[0m \u001b[36mМодели и ORM.md:88\u001b[0m простым языком\r\n расписал:\r\n\r\n - оптимизацию запросов: \u001b[36mselect_related\u001b[0m,\r\n \u001b[36mprefetch_related\u001b[0m, проблему N+1;\r\n\r\n - агрегацию и аннотацию;\r\n - логические условия: \u001b[36mQ\u001b[0m и \u001b[36mF\u001b[0m-выражения.\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n\u001b[48;5;238;22m\u001b[44X\r\n\u001b[1;2m \u001b[22;22mПриведи примеры использования в коде для\r\n каждого фрагмента\r\n\r\n\u001b[0m\u001b[44X\r\n\u001b[2m• \u001b[0mПлан: добавлю короткие Django ORM-примеры\r\n прямо под соответствующими блоками:\r\n оптимизация, агрегация/аннотация, \u001b[36mQ\u001b[0m и \u001b[36mF\u001b[0m.\r\n Остальную заметку не трогаю.\r\n\r\n\u001b[2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Модели и ORM.md\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n• \u001b[0mСейчас там есть текстовые примеры, но не\r\n код. Заменю их на минимальные блоки кода,\r\n чтобы было видно реальное использование\r\n методов.\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 90 Library/Programming/Python/\r\nDjango: Модели и ORM.md (\u001b[32m+39\u001b[0m \u001b[31m-4\u001b[0m)\r\n \u001b[2m 93\r\n\u001b[48;5;52;22m \u001b[2m 94 \u001b[31;22m-\u001b[38;2;205;214;244;2mПример: если вывести 100 книг и для\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244m каждой обратиться к \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mbook.author\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m,\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244m без оптимизации может получиться 1\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244m01 запрос. С \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mselect_related('autho\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mr')\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m авторы будут загружены сразу.\r\n\u001b[39;48;5;22;22m \u001b[2m 94 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\u001b[26X\r\n\u001b[39m \u001b[2m 95 \u001b[32;22m+\u001b[38;2;147;153;178m# select_related: книга + её автор\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22mзагружаются одним SQL-запросом\r\n\u001b[39m \u001b[2m 96 \u001b[32;22m+\u001b[38;2;205;214;244mbooks \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mBook\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mselect_related\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m(\u001b[38;2;166;227;161m\"author\"\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 97 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 98 \u001b[32;22m+\u001b[38;2;203;166;247mfor\u001b[38;2;205;214;244m book \u001b[38;2;203;166;247min\u001b[38;2;205;214;244m books\u001b[38;2;147;153;178m:\r\n\u001b[39m \u001b[2m 99 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;250;179;135mprint\u001b[38;2;147;153;178m(\u001b[38;2;205;214;244mbook\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mtitle\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m book\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mauthor\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mn\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mame\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m100 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m101 \u001b[32;22m+\r\n\u001b[39m \u001b[2m102 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\r\n\u001b[39m \u001b[2m103 \u001b[32;22m+\u001b[38;2;147;153;178m# prefetch_related: авторы загружаю\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22mтся отдельно, затем Django связывае\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22mт их с книгами\r\n\u001b[39m \u001b[2m104 \u001b[32;22m+\u001b[38;2;205;214;244mbooks \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mBook\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mprefetch_relat\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22med\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"authors\"\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m105 \u001b[32;22m+\r\n\u001b[39m \u001b[2m106 \u001b[32;22m+\u001b[38;2;203;166;247mfor\u001b[38;2;205;214;244m book \u001b[38;2;203;166;247min\u001b[38;2;205;214;244m books\u001b[38;2;147;153;178m:\r\n\u001b[39m \u001b[2m107 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;250;179;135mprint\u001b[38;2;147;153;178m(\u001b[38;2;205;214;244mbook\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mtitle\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m[\u001b[38;2;205;214;244mauthor\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mname\r\n\u001b[39m \u001b[2m \u001b[38;2;203;166;247;22mfor\u001b[38;2;205;214;244m author \u001b[38;2;203;166;247min\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mbook\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mauthors\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mall\u001b[38;2;147;153;178m()])\r\n\u001b[39m \u001b[2m108 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[0m \u001b[2m109\u001b[37X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m113\r\n\u001b[48;5;52;22m \u001b[2m100 \u001b[31;22m-\u001b[38;2;205;214;244;2mПример: \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mBook.objects.aggregate(Avg\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244m('rating'))\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m вернёт средний рейтинг\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244m всех книг. \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mAuthor.objects.annotat\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244me(total=Count('books'))\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m добавит ка\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mждому автору поле \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mtotal\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m с количес\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mтвом его книг.\r\n\u001b[39;48;5;22;22m \u001b[2m114 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\u001b[26X\r\n\u001b[39m \u001b[2m115 \u001b[32;22m+\u001b[38;2;203;166;247mfrom\u001b[38;2;205;214;244m django\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mdb\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mmodels \u001b[38;2;203;166;247mimport\u001b[38;2;205;214;244m Avg\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m C\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mount\r\n\u001b[0m \u001b[2m116\u001b[37X\r\n\u001b[48;5;22;22m \u001b[2m117 \u001b[32;22m+\u001b[38;2;147;153;178m# aggregate: одно итоговое значение\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m по всей таблице книг\r\n\u001b[39m \u001b[2m118 \u001b[32;22m+\u001b[38;2;205;214;244mresult \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mBook\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250maggregate\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mavg\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22m_rating\u001b[38;2;148;226;213m=\u001b[38;2;137;180;250mAvg\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"rating\"\u001b[38;2;147;153;178m))\r\n\u001b[39m \u001b[2m119 \u001b[32;22m+\u001b[38;2;250;179;135mprint\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mresult\u001b[38;2;147;153;178m[\u001b[38;2;166;227;161m\"avg_rating\"\u001b[38;2;147;153;178m])\r\n\u001b[39m \u001b[2m120 \u001b[32;22m+\r\n\u001b[39m \u001b[2m121 \u001b[32;22m+\u001b[38;2;147;153;178m# annotate: вычисляемое поле для ка\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22mждого автора\r\n\u001b[39m \u001b[2m122 \u001b[32;22m+\u001b[38;2;205;214;244mauthors \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mAuthor\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mannotate\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mt\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22motal_books\u001b[38;2;148;226;213m=\u001b[38;2;137;180;250mCount\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"books\"\u001b[38;2;147;153;178m))\r\n\u001b[39m \u001b[2m123 \u001b[32;22m+\r\n\u001b[39m \u001b[2m124 \u001b[32;22m+\u001b[38;2;203;166;247mfor\u001b[38;2;205;214;244m author \u001b[38;2;203;166;247min\u001b[38;2;205;214;244m authors\u001b[38;2;147;153;178m:\r\n\u001b[39m \u001b[2m125 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;250;179;135mprint\u001b[38;2;147;153;178m(\u001b[38;2;205;214;244mauthor\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mname\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m author\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mtotal\r\n\u001b[0m \u001b[2m128 \u001b[0m \u001b[38;2;147;153;178m###\u001b[38;2;249;226;175m \u001b[38;2;148;226;213mЛогические условия\u001b[13X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m131\r\n\u001b[48;5;52;22m \u001b[2m106 \u001b[31;22m-\u001b[38;2;205;214;244;2mПример \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mQ\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m: найти книги, где рейтин\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mг выше 4 или название содержит \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mDja\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mngo\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39;22m \u001b[2m107 \u001b[31;22m-\u001b[38;2;205;214;244;2mПример \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mF\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m: увеличить счётчик просм\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mотров на 1 прямо в БД: \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mviews = F('\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mviews') + 1\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39;48;5;22;22m \u001b[2m135 \u001b[32;22m+\u001b[38;2;147;153;178m# Q: рейтинг выше 4 или название со\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22mдержит Django\r\n\u001b[39m \u001b[2m136 \u001b[32;22m+\u001b[38;2;205;214;244mbooks \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mBook\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mfilter\u001b[38;2;147;153;178m(\r\n\u001b[39m \u001b[2m137 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mQ\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mrating__gt\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m4\u001b[38;2;147;153;178m)\u001b[38;2;205;214;244m \u001b[38;2;148;226;213m|\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mQ\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mtitle__icon\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mtains\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"Django\"\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m138 \u001b[32;22m+\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m139 \u001b[32;22m+\r\n\u001b[39m \u001b[2m140 \u001b[32;22m+\u001b[38;2;147;153;178m# F: увеличить счётчик просмотров п\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22mрямо в БД\r\n\u001b[39m \u001b[2m141 \u001b[32;22m+\u001b[38;2;137;180;250mBook\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mfilter\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mid\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m1\u001b[38;2;147;153;178m)\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mupdate\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mvi\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mews\u001b[38;2;148;226;213m=\u001b[38;2;137;180;250mF\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"views\"\u001b[38;2;147;153;178m)\u001b[38;2;205;214;244m \u001b[38;2;148;226;213m+\u001b[38;2;205;214;244m \u001b[38;2;250;179;135m1\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m142 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[0m\u001b[44X\r\n\u001b[2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Модели и ORM.md\r\n\r\n\u001b[2m │ \u001b[38;2;166;227;161;22mORM.md'\r\n\u001b[39;2m └ .../Programming/Python/Django: Модели и\r\n … +64 lines (ctrl + t to view\r\n transcript)\r\n\u001b[0m \u001b[2m +```\r\n\u001b[0m \u001b[2m +39 -4\r\n\r\n────────────────────────────────────────────\r\n\r\n• \u001b[0mГотово.\r\n\r\n В \u001b[36m90 Library/Programming/Python/Django:\r\n\u001b[0m \u001b[36mМодели и ORM.md:94\u001b[0m добавил кодовые примеры\r\n для:\r\n\r\n - \u001b[36mselect_related\u001b[0m и \u001b[36mprefetch_related\u001b[0m;\r\n - \u001b[36maggregate\u001b[0m и \u001b[36mannotate\u001b[0m;\r\n - \u001b[36mQ\u001b[0m-объектов и \u001b[36mF\u001b[0m-выражений.\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n\u001b[48;5;238;22m\u001b[44X\r\n\u001b[1;2m \u001b[22;22mну и для остальных фрагментов\r\n\r\n\u001b[0m\u001b[44X\r\n\u001b[2m• \u001b[0mПлан: пройдусь по всей заметке и добавлю\r\n короткие кодовые примеры к оставшимся\r\n смысловым блокам: типы полей, отношения,\r\n миграции, CRUD и field lookups. Уже\r\n расписанные оптимизацию/агрегацию/\r\n логические условия не буду дублировать.\r\n\r\n\u001b[2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Модели и ORM.md\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n• \u001b[0mДобавлю примеры там, где сейчас только\r\n списки: структура проекта получит\r\n минимальный \u001b[36mtree\u001b[0m, поля и отношения —\r\n пример моделей, миграции — команды, CRUD и\r\n lookups — ORM-запросы.\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 90 Library/Programming/Python/\r\nDjango: Модели и ORM.md (\u001b[32m+72\u001b[0m \u001b[31m-0\u001b[0m)\r\n \u001b[2m 20\r\n\u001b[48;5;22;22m \u001b[2m 21 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mtext\u001b[28X\r\n\u001b[39m \u001b[2m 22 \u001b[32;22m+\u001b[38;2;205;214;244mproject/\r\n\u001b[39m \u001b[2m 23 \u001b[32;22m+\u001b[38;2;205;214;244m├── manage.py\r\n\u001b[39m \u001b[2m 24 \u001b[32;22m+\u001b[38;2;205;214;244m├── project/\r\n\u001b[39m \u001b[2m 25 \u001b[32;22m+\u001b[38;2;205;214;244m│ ├── settings.py\r\n\u001b[39m \u001b[2m 26 \u001b[32;22m+\u001b[38;2;205;214;244m│ └── urls.py\r\n\u001b[39m \u001b[2m 27 \u001b[32;22m+\u001b[38;2;205;214;244m└── app/\r\n\u001b[39m \u001b[2m 28 \u001b[32;22m+\u001b[38;2;205;214;244m └── models.py\r\n\u001b[39m \u001b[2m 29 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m 30 \u001b[32;22m+\r\n\u001b[0m \u001b[2m 31 \u001b[0m \u001b[38;2;147;153;178m##\u001b[38;2;250;179;135m \u001b[38;2;148;226;213mОпределение моделей\u001b[13X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 57\r\n\u001b[48;5;22;22m \u001b[2m 58 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\u001b[26X\r\n\u001b[39m \u001b[2m 59 \u001b[32;22m+\u001b[38;2;203;166;247mclass\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mArticle\u001b[38;2;147;153;178m(\u001b[38;2;249;226;175mmodels\u001b[38;2;148;226;213m.\u001b[38;2;249;226;175mModel\u001b[38;2;147;153;178m):\r\n\u001b[39m \u001b[2m 60 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;250;179;135mid\u001b[38;2;205;214;244m \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mAutoField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mprimary_k\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mey\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135mTrue\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 61 \u001b[32;22m+\u001b[38;2;205;214;244m title \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mCharField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mmax_le\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mngth\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m200\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 62 \u001b[32;22m+\u001b[38;2;205;214;244m body \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mTextField\u001b[38;2;147;153;178m()\r\n\u001b[39m \u001b[2m 63 \u001b[32;22m+\u001b[38;2;205;214;244m views \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mIntegerField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mdef\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mault\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m0\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 64 \u001b[32;22m+\u001b[38;2;205;214;244m price \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mDecimalField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mmax\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22m_digits\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m10\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mdecimal_places\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m2\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 65 \u001b[32;22m+\u001b[38;2;205;214;244m is_published \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mBooleanFi\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22meld\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mdefault\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135mFalse\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 66 \u001b[32;22m+\u001b[38;2;205;214;244m published_at \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mDateTimeF\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mield\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mnull\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135mTrue\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mblank\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135mTrue\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 67 \u001b[32;22m+\u001b[38;2;205;214;244m author_email \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mEmailFiel\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22md\u001b[38;2;147;153;178m()\r\n\u001b[39m \u001b[2m 68 \u001b[32;22m+\u001b[38;2;205;214;244m attachment \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mFileField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mu\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mpload_to\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"files/\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mblank\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135mTrue\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 69 \u001b[32;22m+\u001b[38;2;205;214;244m cover \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mImageField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172muploa\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22md_to\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"covers/\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mblank\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135mTrue\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 70 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m 71 \u001b[32;22m+\r\n\u001b[0m \u001b[2m 72 \u001b[0m \u001b[38;2;147;153;178m###\u001b[38;2;249;226;175m \u001b[38;2;148;226;213mОтношения\u001b[22X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 83\r\n\u001b[48;5;22;22m \u001b[2m 84 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\u001b[26X\r\n\u001b[39m \u001b[2m 85 \u001b[32;22m+\u001b[38;2;203;166;247mclass\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mAuthor\u001b[38;2;147;153;178m(\u001b[38;2;249;226;175mmodels\u001b[38;2;148;226;213m.\u001b[38;2;249;226;175mModel\u001b[38;2;147;153;178m):\r\n\u001b[39m \u001b[2m 86 \u001b[32;22m+\u001b[38;2;205;214;244m name \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mCharField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mmax_len\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mgth\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m100\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 87 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 88 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 89 \u001b[32;22m+\u001b[38;2;203;166;247mclass\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mProfile\u001b[38;2;147;153;178m(\u001b[38;2;249;226;175mmodels\u001b[38;2;148;226;213m.\u001b[38;2;249;226;175mModel\u001b[38;2;147;153;178m):\r\n\u001b[39m \u001b[2m 90 \u001b[32;22m+\u001b[38;2;205;214;244m author \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mOneToOneField\u001b[38;2;147;153;178m(\u001b[38;2;205;214;244mA\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22muthor\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mon_delete\u001b[38;2;148;226;213m=\u001b[38;2;205;214;244mmodels\u001b[38;2;148;226;213m.\u001b[38;2;250;179;135mCASCADE\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 91 \u001b[32;22m+\u001b[38;2;205;214;244m bio \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mTextField\u001b[38;2;147;153;178m()\r\n\u001b[39m \u001b[2m 92 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 93 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 94 \u001b[32;22m+\u001b[38;2;203;166;247mclass\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mBook\u001b[38;2;147;153;178m(\u001b[38;2;249;226;175mmodels\u001b[38;2;148;226;213m.\u001b[38;2;249;226;175mModel\u001b[38;2;147;153;178m):\r\n\u001b[39m \u001b[2m 95 \u001b[32;22m+\u001b[38;2;205;214;244m title \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mCharField\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mmax_le\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mngth\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m200\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 96 \u001b[32;22m+\u001b[38;2;205;214;244m author \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mForeignKey\u001b[38;2;147;153;178m(\u001b[38;2;205;214;244mAuth\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mor\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mon_delete\u001b[38;2;148;226;213m=\u001b[38;2;205;214;244mmodels\u001b[38;2;148;226;213m.\u001b[38;2;250;179;135mPROTECT\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 97 \u001b[32;22m+\u001b[38;2;205;214;244m co_authors \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmodels\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mManyToManyF\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mield\u001b[38;2;147;153;178m(\u001b[38;2;205;214;244mAuthor\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mrelated_name\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"coauthor\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22med_books\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mblank\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135mTrue\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 98 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m 99 \u001b[32;22m+\r\n\u001b[0m \u001b[2m100 \u001b[0m \u001b[38;2;147;153;178m---\u001b[32X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m107\r\n\u001b[48;5;22;22m \u001b[2m108 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mbash\u001b[28X\r\n\u001b[39m \u001b[2m109 \u001b[32;22m+\u001b[38;2;137;180;250mpython\u001b[38;2;205;214;244m manage.py makemigrations app\r\n\u001b[39m \u001b[2m110 \u001b[32;22m+\u001b[38;2;137;180;250mpython\u001b[38;2;205;214;244m manage.py migrate\r\n\u001b[39m \u001b[2m111 \u001b[32;22m+\u001b[38;2;137;180;250mpython\u001b[38;2;205;214;244m manage.py showmigrations app\r\n\u001b[39m \u001b[2m112 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m113 \u001b[32;22m+\r\n\u001b[0m \u001b[2m114 \u001b[0m \u001b[38;2;147;153;178m---\u001b[32X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m127\r\n\u001b[48;5;22;22m \u001b[2m128 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\u001b[26X\r\n\u001b[39m \u001b[2m129 \u001b[32;22m+\u001b[38;2;147;153;178m# Create\r\n\u001b[39m \u001b[2m130 \u001b[32;22m+\u001b[38;2;205;214;244mperson \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mPerson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mcreate\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mfirs\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mt_name\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"Ivan\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mage\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m25\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m131 \u001b[32;22m+\r\n\u001b[39m \u001b[2m132 \u001b[32;22m+\u001b[38;2;147;153;178m# Read\r\n\u001b[39m \u001b[2m133 \u001b[32;22m+\u001b[38;2;205;214;244mpeople \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mPerson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mall\u001b[38;2;147;153;178m()\r\n\u001b[39m \u001b[2m134 \u001b[32;22m+\u001b[38;2;205;214;244mperson \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mPerson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mget\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mid\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m1\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m135 \u001b[32;22m+\u001b[38;2;205;214;244madults \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mPerson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mfilter\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mage_\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22m_gte\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m18\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m136 \u001b[32;22m+\r\n\u001b[39m \u001b[2m137 \u001b[32;22m+\u001b[38;2;147;153;178m# Update\r\n\u001b[39m \u001b[2m140 \u001b[32;22m+\u001b[38;2;147;153;178m# Delete\r\n\u001b[39m \u001b[2m141 \u001b[32;22m+\u001b[38;2;137;180;250mperson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mdelete\u001b[38;2;147;153;178m()\r\n\u001b[39m \u001b[2m142 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m143 \u001b[32;22m+\r\n\u001b[0m \u001b[2m144 \u001b[0m \u001b[38;2;147;153;178m###\u001b[38;2;249;226;175m \u001b[38;2;148;226;213mПоиск по полям (Field Lookups)\u001b[1X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m150\r\n\u001b[48;5;22;22m \u001b[2m151 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\u001b[26X\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mexact\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"ivan\"\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m154 \u001b[32;22m+\u001b[38;2;137;180;250mPerson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mfilter\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mage__gt\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135m18\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m155 \u001b[32;22m+\u001b[38;2;137;180;250mPerson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mfilter\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mage__range\u001b[38;2;148;226;213m=\u001b[38;2;147;153;178m(\u001b[38;2;250;179;135m1\r\n\u001b[39m \u001b[2m \u001b[38;2;250;179;135;22m8\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;250;179;135m30\u001b[38;2;147;153;178m))\r\n\u001b[39m \u001b[2m156 \u001b[32;22m+\u001b[38;2;137;180;250mPerson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mfilter\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mfirst_name__i\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mcontains\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"iv\"\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m157 \u001b[32;22m+\u001b[38;2;137;180;250mPerson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mfilter\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mid__in\u001b[38;2;148;226;213m=\u001b[38;2;147;153;178m[\u001b[38;2;250;179;135m1\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;250;179;135m2\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m \u001b[38;2;250;179;135m3\u001b[38;2;147;153;178m])\r\n\u001b[39m \u001b[2m158 \u001b[32;22m+\u001b[38;2;137;180;250mPerson\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mobjects\u001b[38;2;148;226;213m.\u001b[38;2;137;180;250mfilter\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mbio__isnull\u001b[38;2;148;226;213m=\u001b[38;2;250;179;135mT\r\n\u001b[39m \u001b[2m \u001b[38;2;250;179;135;22mrue\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m159 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m160 \u001b[32;22m+\r\n\u001b[0m \u001b[2m161 \u001b[0m \u001b[38;2;147;153;178m###\u001b[38;2;249;226;175m \u001b[38;2;148;226;213mОптимизация запросов\u001b[11X\r\n\r\n\u001b[39;2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Модели и ORM.md\r\n\r\n\u001b[2m └ \u001b[36;22mRead\u001b[0m Django: Модели и ORM.md\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n• \u001b[0mГотово.\r\n\r\n В \u001b[36m90 Library/Programming/Python/Django:\r\n\u001b[0m - типы полей;\r\n - отношения;\r\n - миграции;\r\n - CRUD;\r\n - field lookups.\r\n\r\n Проверил глазами итоговый Markdown.\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n\u001b[48;5;238;22m\u001b[44X\r\n\u001b[1;2m \u001b[22;22m\"90 Library/Programming/Python/Django:\r\n Представления, шаблоны и CBV.md\" давай\r\n сюда тоже добавим примеры и распишем\r\n непонятные моменты\r\n\r\n\u001b[0m\u001b[44X\r\n\u001b[2m• \u001b[0mПлан: сначала прочитаю заметку целиком и\r\n соседний стиль уже доработанной Django-\r\n заметки, затем точечно распишу неясные\r\n места и добавлю короткие примеры к каждому\r\n основному блоку. Массово структуру менять\r\n не буду.\r\n\r\n\u001b[2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Модели и ORM.md\u001b[2m, \u001b[0mDjango:\r\n Представления, шаблоны и CBV.md\r\n\r\n\u001b[32;1m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mn\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"Django: Представления,\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mшаблоны и CBV\"\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'99 System/INDEX.md'\r\n\u001b[39;2m └ 1 matches in 1F:\r\n\r\n … +3 lines (ctrl + t to view transcript)\r\n\u001b[0m \u001b[2mseed | concept ...\r\n\r\n\r\n────────────────────────────────────────────\r\n\r\n• \u001b[0mВ заметке есть несостыковка: файл и индекс\r\n называются «Представления, шаблоны и CBV»,\r\n а \u001b[36mtitle\u001b[0m внутри заметки короче. Заодно\r\n приведу \u001b[36mtitle\u001b[0m и статус в порядок, потому\r\n что файл редактируется.\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 90 Library/Programming/Python/\r\nDjango: Представления, шаблоны и CBV.md\r\n(\u001b[32m+155\u001b[0m \u001b[31m-4\u001b[0m)\r\n \u001b[2m 1 \u001b[0m \u001b[38;2;147;153;178m---\r\n\u001b[39;48;5;52m \u001b[2m 2 \u001b[31;22m-\u001b[38;2;205;214;244;2mstatus: seed\u001b[23X\r\n\u001b[39;48;5;22;22m \u001b[2m 2 \u001b[32;22m+\u001b[38;2;205;214;244mstatus: processing\u001b[17X\r\n\u001b[0m \u001b[2m 3 \u001b[0m \u001b[38;2;205;214;244mtype: concept\u001b[22X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 6 \u001b[0m \u001b[38;2;205;214;244mupdated: 2026-05-31\r\n\u001b[39;48;5;52m \u001b[2m 7 \u001b[31;22m-\u001b[38;2;205;214;244;2mtitle: \"Django: Представления и Шаб\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mлоны\"\r\n\u001b[39;48;5;22;22m \u001b[2m 7 \u001b[32;22m+\u001b[38;2;205;214;244mtitle: \"Django: Представления, шабл\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mоны и CBV\"\r\n\u001b[0m \u001b[2m 8 \u001b[0m \u001b[38;2;205;214;244msource: [\"[[lec2-django_lec_urls_vi\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mews_templates-1.pdf]]\", \"[[lec3-dja\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mngo_cbv-1.pdf]]\", \"[[p4-django_cbv-\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m1.pdf]]\"]\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 10\r\n\u001b[48;5;52;22m \u001b[2m 11 \u001b[31;22m-\u001b[38;2;147;153;178;2m#\u001b[38;2;243;139;168m \u001b[38;2;148;226;213mDjango: Представления и Шаблоны\u001b[2X\r\n\u001b[39;48;5;22;22m \u001b[2m 11 \u001b[32;22m+\u001b[38;2;147;153;178m#\u001b[38;2;243;139;168m \u001b[38;2;148;226;213mDjango: Представления, шаблоны и\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;148;226;213;22mCBV\r\n\u001b[0m \u001b[2m 12\u001b[37X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 18\r\n\u001b[48;5;22;22m \u001b[2m 19 \u001b[32;22m+\u001b[38;2;205;214;244mМаршрутизация связывает URL с view-\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mфункцией или view-классом. Имя марш\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mрута (\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mname\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m) нужно, чтобы не хардк\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mодить URL в коде и шаблонах.\r\n\u001b[39m \u001b[2m 20 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 21 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\r\n\u001b[39m \u001b[2m 22 \u001b[32;22m+\u001b[38;2;147;153;178m# project/urls.py\r\n\u001b[39m \u001b[2m 23 \u001b[32;22m+\u001b[38;2;203;166;247mfrom\u001b[38;2;205;214;244m django\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244murls \u001b[38;2;203;166;247mimport\u001b[38;2;205;214;244m include\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m pa\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mth\r\n\u001b[39m \u001b[2m 24 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 25 \u001b[32;22m+\u001b[38;2;205;214;244murlpatterns \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m[\r\n\u001b[39m \u001b[2m 26 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mpath\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"blog/\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;137;180;250minclude\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"blog.url\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22ms\"\u001b[38;2;147;153;178m)),\r\n\u001b[39m \u001b[2m 27 \u001b[32;22m+\u001b[38;2;147;153;178m]\r\n\u001b[39m \u001b[2m 28 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m 29 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 30 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\r\n\u001b[39m \u001b[2m 31 \u001b[32;22m+\u001b[38;2;147;153;178m# blog/urls.py\r\n\u001b[39m \u001b[2m 32 \u001b[32;22m+\u001b[38;2;203;166;247mfrom\u001b[38;2;205;214;244m django\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244murls \u001b[38;2;203;166;247mimport\u001b[38;2;205;214;244m path\r\n\u001b[39m \u001b[2m 33 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 34 \u001b[32;22m+\u001b[38;2;203;166;247mfrom\u001b[38;2;205;214;244m \u001b[38;2;203;166;247m.\u001b[38;2;205;214;244m \u001b[38;2;203;166;247mimport\u001b[38;2;205;214;244m views\r\n\u001b[39m \u001b[2m 35 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 36 \u001b[32;22m+\u001b[38;2;205;214;244mapp_name \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"blog\"\r\n\u001b[39m \u001b[2m 37 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 38 \u001b[32;22m+\u001b[38;2;205;214;244murlpatterns \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m[\r\n\u001b[39m \u001b[2m 39 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mpath\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m views\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mpost_list\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mname\u001b[38;2;148;226;213m=\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22m\"post_list\"\u001b[38;2;147;153;178m),\r\n\u001b[39m \u001b[2m 40 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mpath\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"<int:pk>/\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m views\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mpost_de\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mtail\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mname\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"post_detail\"\u001b[38;2;147;153;178m),\r\n\u001b[39m \u001b[2m 41 \u001b[32;22m+\u001b[38;2;147;153;178m]\r\n\u001b[39m \u001b[2m 42 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m 43 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 44 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\r\n\u001b[39m \u001b[2m 45 \u001b[32;22m+\u001b[38;2;203;166;247mfrom\u001b[38;2;205;214;244m django\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244murls \u001b[38;2;203;166;247mimport\u001b[38;2;205;214;244m reverse\r\n\u001b[39m \u001b[2m 46 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 47 \u001b[32;22m+\u001b[38;2;205;214;244murl \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mreverse\u001b[38;2;147;153;178m(\u001b[38;2;166;227;161m\"blog:post_detail\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;235;160;172mk\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mwargs\u001b[38;2;148;226;213m=\u001b[38;2;147;153;178m{\u001b[38;2;166;227;161m\"pk\"\u001b[38;2;147;153;178m:\u001b[38;2;205;214;244m \u001b[38;2;250;179;135m1\u001b[38;2;147;153;178m})\r\n\u001b[39m \u001b[2m 48 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m 49 \u001b[32;22m+\r\n\u001b[0m \u001b[2m 50 \u001b[0m \u001b[38;2;147;153;178m---\u001b[32X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 52 \u001b[0m \u001b[38;2;147;153;178m##\u001b[38;2;250;179;135m \u001b[38;2;148;226;213mПредставления (Views)\r\n\u001b[39;48;5;52m \u001b[2m 22 \u001b[31;22m-\u001b[38;2;205;214;244;2m Views принимают `HttpRequest` и во\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mзвращают `HttpResponse`.\r\n\u001b[39;48;5;22;22m \u001b[2m 53 \u001b[32;22m+\u001b[38;2;205;214;244mViews принимают \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mHttpRequest\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m и воз\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mвращают \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mHttpResponse\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39m \u001b[2m 54 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 55 \u001b[32;22m+\u001b[38;2;205;214;244mView — это точка входа для запроса.\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m В ней обычно читают данные из БД,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпроверяют условия и возвращают HTML\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m, JSON, редирект или ошибку.\r\n\u001b[0m \u001b[2m 56\u001b[37X\r\n\u001b[0m \u001b[2m 57 \u001b[0m \u001b[38;2;147;153;178m###\u001b[38;2;249;226;175m \u001b[38;2;148;226;213mФункциональные представления (F\r\n\u001b[0m \u001b[2m \u001b[38;2;148;226;213;22mBV)\r\n\u001b[39;48;5;22m \u001b[2m 58 \u001b[32;22m+\u001b[38;2;205;214;244mFBV — обычная функция. Удобна, когд\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mа логика короткая и нестандартная.\r\n\u001b[39m \u001b[2m 59 \u001b[32;22m+\r\n\u001b[0m \u001b[2m 60 \u001b[0m \u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\u001b[26X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 67\r\n\u001b[48;5;22;22m \u001b[2m 68 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\u001b[26X\r\n\u001b[39m \u001b[2m 69 \u001b[32;22m+\u001b[38;2;203;166;247mfrom\u001b[38;2;205;214;244m django\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mshortcuts \u001b[38;2;203;166;247mimport\u001b[38;2;205;214;244m get_ob\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mject_or_404\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m render\r\n\u001b[39m \u001b[2m 70 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 71 \u001b[32;22m+\u001b[38;2;203;166;247mfrom\u001b[38;2;205;214;244m \u001b[38;2;203;166;247m.\u001b[38;2;205;214;244mmodels \u001b[38;2;203;166;247mimport\u001b[38;2;205;214;244m Post\r\n\u001b[39m \u001b[2m 72 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 73 \u001b[32;22m+\u001b[38;2;203;166;247mdef\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mpost_detail\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mrequest\u001b[38;2;147;153;178m,\u001b[38;2;235;160;172m pk\u001b[38;2;147;153;178m):\r\n\u001b[39m \u001b[2m 74 \u001b[32;22m+\u001b[38;2;205;214;244m post \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mget_object_or_404\u001b[38;2;147;153;178m(\u001b[38;2;205;214;244mPost\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;235;160;172;22mpk\u001b[38;2;148;226;213m=\u001b[38;2;205;214;244mpk\u001b[38;2;147;153;178m)\r\n\u001b[39m \u001b[2m 75 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;203;166;247mreturn\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mrender\u001b[38;2;147;153;178m(\u001b[38;2;205;214;244mrequest\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"blog/de\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mtail.html\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m{\u001b[38;2;166;227;161m\"post\"\u001b[38;2;147;153;178m:\u001b[38;2;205;214;244m post\u001b[38;2;147;153;178m})\r\n\u001b[39m \u001b[2m 76 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m 77 \u001b[32;22m+\r\n\u001b[0m \u001b[2m 78 \u001b[0m \u001b[38;2;147;153;178m###\u001b[38;2;249;226;175m \u001b[38;2;148;226;213mКлассовые представления (CBV)\u001b[2X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m 84\r\n\u001b[48;5;22;22m \u001b[2m 85 \u001b[32;22m+\u001b[38;2;205;214;244mCBV — класс с готовым поведением. D\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mjango сам вызывает нужные методы кл\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mасса: например, \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mget()\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m для GET-зап\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mроса или \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mget_queryset()\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m для получ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mения списка объектов.\r\n\u001b[39m \u001b[2m 86 \u001b[32;22m+\r\n\u001b[0m \u001b[2m 87 \u001b[0m \u001b[38;2;147;153;178m**\u001b[38;2;243;139;168;1mПример ListView:\u001b[38;2;147;153;178;22m**\u001b[15X\r\n\u001b[0m \u001b[2m 88 \u001b[0m \u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\r\n\u001b[39;48;5;22m \u001b[2m 89 \u001b[32;22m+\u001b[38;2;203;166;247mfrom\u001b[38;2;205;214;244m django\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mviews\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244mgeneric \u001b[38;2;203;166;247mimport\u001b[38;2;205;214;244m De\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mtailView\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m ListView\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m TemplateView\r\n\u001b[39m \u001b[2m 90 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 91 \u001b[32;22m+\u001b[38;2;203;166;247mfrom\u001b[38;2;205;214;244m \u001b[38;2;203;166;247m.\u001b[38;2;205;214;244mmodels \u001b[38;2;203;166;247mimport\u001b[38;2;205;214;244m Post\r\n\u001b[39m \u001b[2m 92 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 93 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 94 \u001b[32;22m+\u001b[38;2;203;166;247mclass\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mAboutView\u001b[38;2;147;153;178m(\u001b[38;2;249;226;175mTemplateView\u001b[38;2;147;153;178m):\r\n\u001b[39m \u001b[2m 95 \u001b[32;22m+\u001b[38;2;205;214;244m template_name \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"blog/about.htm\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22ml\"\r\n\u001b[39m \u001b[2m 96 \u001b[32;22m+\r\n\u001b[39m \u001b[2m 97 \u001b[32;22m+\r\n\u001b[0m \u001b[2m 98 \u001b[0m \u001b[38;2;203;166;247mclass\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mPostListView\u001b[38;2;147;153;178m(\u001b[38;2;249;226;175mListView\u001b[38;2;147;153;178m):\u001b[6X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m102 \u001b[0m \u001b[38;2;166;227;161m paginate_by = 10\r\n\u001b[39;48;5;22m \u001b[2m103 \u001b[32;22m+\u001b[35X\r\n\u001b[39m \u001b[2m104 \u001b[32;22m+\u001b[38;2;166;227;161m def get_queryset(self):\r\n\u001b[39m \u001b[2m105 \u001b[32;22m+\u001b[38;2;166;227;161m return Post.objects.filter(\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mis_published=True).order_by(\"-creat\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22med_at\")\r\n\u001b[39m \u001b[2m106 \u001b[32;22m+\r\n\u001b[39m \u001b[2m107 \u001b[32;22m+\r\n\u001b[39m \u001b[2m108 \u001b[32;22m+\u001b[38;2;205;214;244mclass PostDetailView(DetailView):\r\n\u001b[39m \u001b[2m109 \u001b[32;22m+\u001b[38;2;205;214;244m model = Post\r\n\u001b[39m \u001b[2m110 \u001b[32;22m+\u001b[38;2;205;214;244m template_name = \"blog/detail.ht\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mml\"\r\n\u001b[39m \u001b[2m111 \u001b[32;22m+\u001b[38;2;205;214;244m context_object_name = \"post\"\r\n\u001b[0m \u001b[2m112 \u001b[0m \u001b[38;2;147;153;178m```\u001b[32X\r\n\u001b[0m \u001b[2m113\r\n\u001b[48;5;22;22m \u001b[2m114 \u001b[32;22m+\u001b[38;2;205;214;244m```python\u001b[26X\r\n\u001b[39m \u001b[2m115 \u001b[32;22m+\u001b[38;2;205;214;244m# blog/urls.py\r\n\u001b[39m \u001b[2m116 \u001b[32;22m+\u001b[38;2;205;214;244mfrom django.urls import path\r\n\u001b[39m \u001b[2m117 \u001b[32;22m+\r\n\u001b[39m \u001b[2m118 \u001b[32;22m+\u001b[38;2;205;214;244mfrom .views import AboutView, PostD\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22metailView, PostListView\r\n\u001b[39m \u001b[2m119 \u001b[32;22m+\r\n\u001b[39m \u001b[2m120 \u001b[32;22m+\u001b[38;2;205;214;244mapp_name = \"blog\"\r\n\u001b[39m \u001b[2m121 \u001b[32;22m+\r\n\u001b[39m \u001b[2m122 \u001b[32;22m+\u001b[38;2;205;214;244murlpatterns = [\r\n\u001b[39m \u001b[2m123 \u001b[32;22m+\u001b[38;2;205;214;244m path(\"about/\", AboutView.as_vie\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mw(), name=\"about\"),\r\n\u001b[39m \u001b[2m124 \u001b[32;22m+\u001b[38;2;205;214;244m path(\"\", PostListView.as_view()\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m, name=\"post_list\"),\r\n\u001b[39m \u001b[2m125 \u001b[32;22m+\u001b[38;2;205;214;244m path(\"<int:pk>/\", PostDetailVie\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mw.as_view(), name=\"post_detail\"),\r\n\u001b[39m \u001b[2m126 \u001b[32;22m+\u001b[38;2;205;214;244m]\r\n\u001b[39m \u001b[2m127 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m128 \u001b[32;22m+\r\n\u001b[0m \u001b[2m129 \u001b[0m \u001b[38;2;147;153;178m---\u001b[32X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m138\r\n\u001b[48;5;22;22m \u001b[2m139 \u001b[32;22m+\u001b[38;2;205;214;244mШаблон получает контекст из view. Н\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mапример, если view передала \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m{\"post\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22ms\": posts}\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m, в шаблоне доступна пер\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mеменная \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244mposts\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39m \u001b[2m140 \u001b[32;22m+\r\n\u001b[39m \u001b[2m141 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mhtml\r\n\u001b[39m \u001b[2m142 \u001b[32;22m+\u001b[38;2;205;214;244m{% for post in posts %}\r\n\u001b[39m \u001b[2m143 \u001b[32;22m+\u001b[38;2;205;214;244m <article>\r\n\u001b[39m \u001b[2m144 \u001b[32;22m+\u001b[38;2;205;214;244m <h2>\r\n\u001b[39m \u001b[2m145 \u001b[32;22m+\u001b[38;2;205;214;244m <a href=\"{% url 'blog:post_de\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mtail' post.pk %}\">\r\n\u001b[39m \u001b[2m146 \u001b[32;22m+\u001b[38;2;205;214;244m {{ post.title|upper }}\r\n\u001b[39m \u001b[2m147 \u001b[32;22m+\u001b[38;2;205;214;244m </a>\r\n\u001b[39m \u001b[2m148 \u001b[32;22m+\u001b[38;2;205;214;244m </h2>\r\n\u001b[39m \u001b[2m149 \u001b[32;22m+\r\n\u001b[39m \u001b[2m150 \u001b[32;22m+\u001b[38;2;205;214;244m {% if post.is_published %}\r\n\u001b[39m \u001b[2m151 \u001b[32;22m+\u001b[38;2;205;214;244m <p>{{ post.created_at|date:\"Y\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m-m-d\" }}</p>\r\n\u001b[39m \u001b[2m152 \u001b[32;22m+\u001b[38;2;205;214;244m {% endif %}\r\n\u001b[39m \u001b[2m153 \u001b[32;22m+\u001b[38;2;205;214;244m </article>\r\n\u001b[39m \u001b[2m154 \u001b[32;22m+\u001b[38;2;205;214;244m{% empty %}\r\n\u001b[39m \u001b[2m155 \u001b[32;22m+\u001b[38;2;205;214;244m <p>Постов нет.</p>\r\n\u001b[39m \u001b[2m156 \u001b[32;22m+\u001b[38;2;205;214;244m{% endfor %}\r\n\u001b[39m \u001b[2m157 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m158 \u001b[32;22m+\r\n\u001b[0m \u001b[2m159 \u001b[0m \u001b[38;2;147;153;178m###\u001b[38;2;249;226;175m \u001b[38;2;148;226;213mНаследование шаблонов\u001b[10X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m163\r\n\u001b[48;5;22;22m \u001b[2m164 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mhtml\u001b[28X\r\n\u001b[39m \u001b[2m165 \u001b[32;22m+\u001b[38;2;205;214;244m<!-- templates/base.html -->\r\n\u001b[39m \u001b[2m166 \u001b[32;22m+\u001b[38;2;205;214;244m<!doctype html>\r\n\u001b[39m \u001b[2m167 \u001b[32;22m+\u001b[38;2;205;214;244m<html lang=\"ru\">\r\n\u001b[39m \u001b[2m168 \u001b[32;22m+\u001b[38;2;205;214;244m <head>\r\n\u001b[39m \u001b[2m169 \u001b[32;22m+\u001b[38;2;205;214;244m <title>{% block title %}Сайт{%\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mendblock %}</title>\r\n\u001b[39m \u001b[2m170 \u001b[32;22m+\u001b[38;2;205;214;244m </head>\r\n\u001b[39m \u001b[2m171 \u001b[32;22m+\u001b[38;2;205;214;244m <body>\r\n\u001b[39m \u001b[2m172 \u001b[32;22m+\u001b[38;2;205;214;244m <main>\r\n\u001b[39m \u001b[2m173 \u001b[32;22m+\u001b[38;2;205;214;244m {% block content %}{% endbloc\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mk %}\r\n\u001b[39m \u001b[2m174 \u001b[32;22m+\u001b[38;2;205;214;244m </main>\r\n\u001b[39m \u001b[2m175 \u001b[32;22m+\u001b[38;2;205;214;244m </body>\r\n\u001b[39m \u001b[2m176 \u001b[32;22m+\u001b[38;2;205;214;244m</html>\r\n\u001b[39m \u001b[2m177 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m178 \u001b[32;22m+\r\n\u001b[39m \u001b[2m179 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mhtml\r\n\u001b[39m \u001b[2m180 \u001b[32;22m+\u001b[38;2;205;214;244m<!-- templates/blog/list.html -->\r\n\u001b[39m \u001b[2m181 \u001b[32;22m+\u001b[38;2;205;214;244m{% extends \"base.html\" %}\r\n\u001b[39m \u001b[2m182 \u001b[32;22m+\r\n\u001b[39m \u001b[2m183 \u001b[32;22m+\u001b[38;2;205;214;244m{% block title %}Посты{% endblock %\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m}\r\n\u001b[39m \u001b[2m184 \u001b[32;22m+\r\n\u001b[39m \u001b[2m185 \u001b[32;22m+\u001b[38;2;205;214;244m{% block content %}\r\n\u001b[39m \u001b[2m186 \u001b[32;22m+\u001b[38;2;205;214;244m <h1>Посты</h1>\r\n\u001b[39m \u001b[2m187 \u001b[32;22m+\r\n\u001b[39m \u001b[2m188 \u001b[32;22m+\u001b[38;2;205;214;244m {% for post in posts %}\r\n\u001b[39m \u001b[2m189 \u001b[32;22m+\u001b[38;2;205;214;244m <a href=\"{% url 'blog:post_deta\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mil' post.pk %}\">\r\n\u001b[39m \u001b[2m190 \u001b[32;22m+\u001b[38;2;205;214;244m {{ post.title }}\r\n\u001b[39m \u001b[2m191 \u001b[32;22m+\u001b[38;2;205;214;244m </a>\r\n\u001b[39m \u001b[2m192 \u001b[32;22m+\u001b[38;2;205;214;244m {% endfor %}\r\n\u001b[39m \u001b[2m193 \u001b[32;22m+\u001b[38;2;205;214;244m{% endblock %}\r\n\u001b[39m \u001b[2m194 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m195 \u001b[32;22m+\r\n\u001b[0m \u001b[2m196 \u001b[0m \u001b[38;2;147;153;178m---\u001b[32X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m201 \u001b[0m \u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m В продакшне используется команда\r\n\u001b[0m \u001b[2m \u001b[38;2;147;153;178;22m`\u001b[38;2;205;214;244mpython manage.py collectstatic\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39;48;5;22m \u001b[2m202 \u001b[32;22m+\u001b[35X\r\n\u001b[39m \u001b[2m203 \u001b[32;22m+\u001b[38;2;205;214;244mСтатика — это CSS, JavaScript, изоб\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mражения и другие файлы, которые не\r\n\u001b[39m \u001b[2m207 \u001b[32;22m+\u001b[38;2;250;179;135mSTATIC_URL\u001b[38;2;205;214;244m \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"static/\"\r\n\u001b[39m \u001b[2m208 \u001b[32;22m+\u001b[38;2;250;179;135mSTATICFILES_DIRS\u001b[38;2;205;214;244m \u001b[38;2;148;226;213m=\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m[\u001b[38;2;250;179;135mBASE_DIR\u001b[38;2;205;214;244m \u001b[38;2;148;226;213m/\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"sta\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mtic\"\u001b[38;2;147;153;178m]\r\n\u001b[39m \u001b[2m209 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m210 \u001b[32;22m+\r\n\u001b[39m \u001b[2m211 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mhtml\r\n\u001b[39m \u001b[2m212 \u001b[32;22m+\u001b[38;2;205;214;244m{% load static %}\r\n\u001b[39m \u001b[2m213 \u001b[32;22m+\r\n\u001b[39m \u001b[2m214 \u001b[32;22m+\u001b[38;2;205;214;244m<link rel=\"stylesheet\" href=\"{% sta\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mtic 'css/app.css' %}\">\r\n\u001b[39m \u001b[2m215 \u001b[32;22m+\u001b[38;2;205;214;244m<script src=\"{% static 'js/app.js'\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m%}\"></script>\r\n\u001b[39m \u001b[2m216 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m217 \u001b[32;22m+\r\n\u001b[39m \u001b[2m218 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mbash\r\n\u001b[39m \u001b[2m219 \u001b[32;22m+\u001b[38;2;137;180;250mpython\u001b[38;2;205;214;244m manage.py collectstatic\r\n\u001b[39m \u001b[2m220 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[0m\u001b[44X\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n• \u001b[0mОсновной текст готов. Сейчас проверю\r\n Markdown-фрагменты и обновлю строку в\r\n индексе, где статус ещё \u001b[36mseed\u001b[0m.\r\n\r\n\u001b[2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Представления, шаблоны и\r\n CBV.md\u001b[2m, \u001b[0mINDEX.md\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 99 System/INDEX.md (\u001b[32m+1\u001b[0m \u001b[31m-1\u001b[0m)\r\n \u001b[2m524 \u001b[0m \u001b[38;2;205;214;244m| [[Django: Модели и ORM]] | Django\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m: Модели и ORM | processing | conce\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mpt | [django, backend, orm, databas\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22me, migrations] |\r\n\u001b[39;48;5;52m \u001b[2m525 \u001b[31;22m-\u001b[38;2;205;214;244;2m| [[Django: Представления, шаблоны\u001b[1X\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mи CBV]] | Django: Представления, ша\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mблоны и CBV | seed | concept | [dja\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244mngo, routing, templates, cbv, fbv]\r\n\u001b[39;22m \u001b[2m \u001b[38;2;205;214;244m|\r\n\u001b[39;48;5;22;22m \u001b[2m525 \u001b[32;22m+\u001b[38;2;205;214;244m| [[Django: Представления, шаблоны\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи CBV]] | Django: Представления, ша\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mблоны и CBV | processing | concept\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m| [django, routing, templates, cbv,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m fbv] |\r\n\u001b[0m \u001b[2m526 \u001b[0m \u001b[38;2;205;214;244m| [[Django: Работа с формами и CUD]\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m] | Django: Работа с формами и CUD\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m| seed | concept | [django, forms,\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mcrud, validation, modelform] |\r\n\r\n\u001b[32;1m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m git diff\u001b[38;2;147;153;178m --\u001b[38;2;235;160;172mstat\u001b[38;2;148;226;213m --\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'90 Library/\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mProgramming/Python/Django:\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mПредставления, шаблоны и CBV.md'\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'99\r\n\u001b[39;2m │ … +1 lines\r\n └ .../Python/Django: Представления,\r\n\u001b[0m \u001b[2mшаблоны и CBV.md | 159 +++++++++++++++++\r\n … +3 lines (ctrl + t to view transcript)\r\n\u001b[0m \u001b[2m 2 files changed, 156 insertions(+), 5\r\n\u001b[0m \u001b[2mdeletions(-)\r\n\r\n\u001b[32;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m git diff\u001b[38;2;147;153;178m --\u001b[38;2;235;160;172mcheck\u001b[38;2;148;226;213m --\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'90 Library/\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mProgramming/Python/Django:\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mПредставления, шаблоны и CBV.md'\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'99\r\n\u001b[39;2m │ … +1 lines\r\n────────────────────────────────────────────\r\n\r\n• \u001b[0mГотово.\r\n\r\n В \u001b[36m90 Library/Programming/Python/Django:\r\n\u001b[0m - FBV;\r\n - CBV: \u001b[36mTemplateView\u001b[0m, \u001b[36mListView\u001b[0m,\r\n \u001b[36mDetailView\u001b[0m, \u001b[36m.as_view()\u001b[0m;\r\n\r\n - DTL: переменные, теги, фильтры;\r\n - наследования шаблонов;\r\n - статических файлов.\r\n\r\n Также исправил \u001b[36mtitle\u001b[0m внутри заметки под\r\n название файла, перевёл статус в\r\n \u001b[36mprocessing\u001b[0m и обновил \u001b[36m99 System/\r\n\u001b[0m \u001b[36mINDEX.md:525\u001b[0m.\r\n\r\n\u001b[2m─ Worked for 1m 10s ────────────────────────\r\n\r\n\u001b[48;5;238;22m\u001b[44X\r\n\u001b[1;2m \u001b[22;22mконвертеры распиши подробнее\r\n\r\n\u001b[0m\u001b[44X\r\n\u001b[2m• \u001b[0mПлан: расширю только часть про URL-\r\n конвертеры: что они делают, какие бывают\r\n стандартные, и добавлю короткие примеры\r\n маршрутов с параметрами.\r\n\r\n\u001b[2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Представления, шаблоны и\r\n\u001b[2m \u001b[0mCBV.md\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n• \u001b[0mВставлю пояснение сразу после текущего\r\n списка, чтобы примеры маршрутов ниже стали\r\n понятнее.\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 90 Library/Programming/Python/\r\nDjango: Представления, шаблоны и CBV.md (\u001b[32m+20\r\n\u001b[31m-0\u001b[0m)\r\n \u001b[2m18\r\n\u001b[48;5;22;22m \u001b[2m19 \u001b[32;22m+\u001b[38;2;205;214;244mКонвертеры вытаскивают часть URL, пр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mоверяют её тип и передают во view ка\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mк аргумент:\r\n\u001b[39m \u001b[2m20 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m<str:name>\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — непустая строка без\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m/\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m; используется по умолчанию.\r\n\u001b[39m \u001b[2m21 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m<int:pk>\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — целое положительное ч\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mисло.\r\n\u001b[39m \u001b[2m22 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m<slug:slug>\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — строка для человек\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mочитаемого URL: буквы, цифры, \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m_\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m, \u001b[38;2;147;153;178m`\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m-\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39m \u001b[2m23 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m<uuid:id>\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — UUID, например \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m0751\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m94d3-6885-417e-a8a8-6c931e272f00\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39m \u001b[2m24 \u001b[32;22m+\u001b[38;2;147;153;178m-\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m<path:subpath>\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m — строка, которая\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m может содержать \u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m/\u001b[38;2;147;153;178m`\u001b[38;2;205;214;244m.\r\n\u001b[39m \u001b[2m25 \u001b[32;22m+\r\n\u001b[0m \u001b[2m ⋮\u001b[36X\r\n\u001b[0m \u001b[2m47 \u001b[0m \u001b[38;2;166;227;161m path(\"<int:pk>/\", views.post_det\r\n\u001b[0m \u001b[2m \u001b[38;2;166;227;161;22mail, name=\"post_detail\"),\r\n\u001b[39;48;5;22m \u001b[2m48 \u001b[32;22m+\u001b[38;2;166;227;161m path(\"tag/<slug:slug>/\", views.p\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mosts_by_tag, name=\"posts_by_tag\"),\r\n\u001b[39m \u001b[2m49 \u001b[32;22m+\u001b[38;2;166;227;161m path(\"files/<path:subpath>/\", vi\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22mews.file_detail, name=\"file_detail\")\r\n\u001b[39m \u001b[2m \u001b[38;2;166;227;161;22m,\r\n\u001b[0m \u001b[2m50 \u001b[0m \u001b[38;2;205;214;244m]\u001b[35X\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m53 \u001b[0m \u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\r\n\u001b[39;48;5;22m \u001b[2m54 \u001b[32;22m+\u001b[38;2;203;166;247mdef\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mpost_detail\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mrequest\u001b[38;2;147;153;178m,\u001b[38;2;235;160;172m pk\u001b[38;2;147;153;178m):\u001b[7X\r\n\u001b[39m \u001b[2m55 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m# pk уже int\r\n\u001b[39m \u001b[2m56 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;250;179;135m...\r\n\u001b[39m \u001b[2m57 \u001b[32;22m+\r\n\u001b[39m \u001b[2m58 \u001b[32;22m+\r\n\u001b[39m \u001b[2m59 \u001b[32;22m+\u001b[38;2;203;166;247mdef\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mposts_by_tag\u001b[38;2;147;153;178m(\u001b[38;2;235;160;172mrequest\u001b[38;2;147;153;178m,\u001b[38;2;235;160;172m slug\u001b[38;2;147;153;178m):\r\n\u001b[39m \u001b[2m60 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m# slug — строка из URL\r\n\u001b[39m \u001b[2m61 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;250;179;135m...\r\n\u001b[39m \u001b[2m62 \u001b[32;22m+\u001b[38;2;147;153;178m```\r\n\u001b[39m \u001b[2m63 \u001b[32;22m+\r\n\u001b[39m \u001b[2m64 \u001b[32;22m+\u001b[38;2;147;153;178m```\u001b[38;2;205;214;244mpython\r\n\u001b[0m \u001b[2m65 \u001b[0m \u001b[38;2;203;166;247mfrom\u001b[38;2;205;214;244m django\u001b[38;2;148;226;213m.\u001b[38;2;205;214;244murls \u001b[38;2;203;166;247mimport\u001b[38;2;205;214;244m reverse\u001b[5X\r\n\r\n\u001b[39;2m•\u001b[0m \u001b[1mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[0m Django: Представления, шаблоны и\r\n\u001b[2m \u001b[0mCBV.md\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n• \u001b[0mГотово.\r\n\r\n В \u001b[36m90 Library/Programming/Python/Django:\r\n\u001b[0m \u001b[36mПредставления, шаблоны и CBV.md:19\r\n\u001b[0m подробнее расписал URL-конвертеры: \u001b[36mstr\u001b[0m,\r\n \u001b[36mint\u001b[0m, \u001b[36mslug\u001b[0m, \u001b[36muuid\u001b[0m, \u001b[36mpath\u001b[0m, плюс добавил\r\n примеры маршрутов и аргументов во view.\r\n\r\n\u001b[2m────────────────────────────────────────────\r\n\r\n\u001b[48;5;238;22m \u001b[43X\r\n\u001b[1m\u001b[22m \u001b[2mSummarize recent commits\r\n\u001b[22m \r\n\u001b[0m\u001b[2X\u001b[2C\u001b[38;2;246;226;183mgpt-5.5 medium\u001b[39;2m · \u001b[38;2;171;223;167;22m~/Documents/Vaults/Secon…\u001b[2A\u001b[42D\u001b[0m",
"rows": 34,
"scrollLine": 949
}
}
},
"pinned": true,
"icon": "terminal",
"title": "Terminal: SecondBrain"
}
},
{
"id": "394fb6e28d09b8f3",
"type": "leaf",
"state": {
"type": "all-properties",
"state": {
"sortOrder": "frequency",
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-archive",
"title": "All properties"
}
},
{
"id": "e51be669e29cd994",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "90 Library/Programming/Web/Основы HTML (структура, таблицы, формы).md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks for Основы HTML (структура, таблицы, формы)"
}
},
{
"id": "86ea4ddeaafff092",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "90 Library/Programming/Ruby On Rails/Sidekiq - основа работы.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links from Sidekiq - основа работы"
}
},
{
"id": "a0ffd3bace615787",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "90 Library/Programming/Python/Django: Работа с формами и CUD.md",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "Outline of Django: Работа с формами и CUD"
}
}
]
}
],
"direction": "horizontal",
"width": 446
},
"left-ribbon": {
"hiddenItems": {
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"markdown-importer:Open format converter": false,
"random-note:Open random note": false,
"audio-recorder:Start/stop recording": false,
"bases:Create new base": false,
"omnisearch:Omnisearch": false,
"templater-obsidian:Templater": false,
"obsidian-git:Open Git source control": false,
"obsidian-excalidraw-plugin:New drawing": false,
"terminal:Open terminal": false
}
},
"active": "28d74d490ab22900",
"lastOpenFiles": [
"90 Library/Programming/Python/Django: Представления, шаблоны и CBV.md",
"update_index.py",
"migrate_titles.py",
"90 Library/Programming/Python/Django: Модели и ORM.md",
"90 Library/Programming/Python/Курс по Python и Django.md",
"90 Library/Programming/Web/CSS: Адаптивность, Flexbox и Grid.md",
"90 Library/Programming/Web/Основы веб-разработки.md",
"90 Library/Programming/Web/Основы HTML (структура, таблицы, формы).md",
"AGENTS.md",
"90 Library/Programming/Web/CSS: Основы, селекторы и блочная модель.md",
"CODEX.md",
"GEMINI.md",
"CLAUDE.md",
"90 Library/Finance/Инвестиции/Антихрупкость как управляемая асимметрия.md",
"90 Library/Finance/Инвестиции/Антихрупкость.md",
"90 Library/Finance/Инвестиции/Заметки в инвестировании.md",
"99 System/Archive/04 Tools/🛠️ Неоконченные заметки.md",
"99 System/Archive/04 Tools/StudyTracker/StudyTracker.md",
"99 System/Archive/04 Tools/StudyTracker/Books/Books.md",
"99 System/Archive/04 Tools/StudyTracker/Courses/Courses.md",
"90 Library/Networking/Основы сетевых технологий.md",
"90 Library/Machine Learning/Data Science с нуля.md",
"90 Library/DevOps/Курс по DevOps от Merion.md",
"90 Library/Networking/Компьютерные сети.md",
"90 Library/Machine Learning/Грокаем Глубокое Обучение.md",
"90 Library/Finance/Инвестиции/Рискуя собственной шкурой.md",
"90 Library/Finance/Инвестиции/Психология денег.md",
"99 System/Archive/04 Tools/StudyTracker/Courses",
"99 System/Archive/04 Tools/StudyTracker/Books",
"99 System/Archive/04 Tools/StudyTracker",
"99 System/Archive/04 Tools",
"99 System/Archive/SocialBase/04 Другие",
"99 System/Archive/SocialBase/03 Коллеги",
"99 System/Archive/SocialBase/02 Друзья",
"99 System/Archive/SocialBase/01 Семья",
"99 System/Cache/Pasted image 20260526204029.png",
"99 System/Cache/Pasted image 20260526203848.png",
"99 System/Cache/Pasted image 20260526203807.png",
"99 System/Cache/Pasted image 20260521134256.png",
"99 System/Cache/Pasted image 20260521134238.png",
"99 System/Cache/Pasted image 20260521134228.png",
"99 System/Cache/Pasted image 20260521134207.png",
"99 System/Cache/Pasted image 20260521133832.png",
"99 System/Cache/Pasted image 20260521133824.png",
"99 System/Cache/Pasted image 20260521133344.png",
"00 Inbox/Untitled.canvas"
]
}