{ "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\"/\"\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(\"/\", 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
\r\n\u001b[39m \u001b[2m144 \u001b[32;22m+\u001b[38;2;205;214;244m

\r\n\u001b[39m \u001b[2m145 \u001b[32;22m+\u001b[38;2;205;214;244m \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 \r\n\u001b[39m \u001b[2m148 \u001b[32;22m+\u001b[38;2;205;214;244m

\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

{{ post.created_at|date:\"Y\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m-m-d\" }}

\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
\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

Постов нет.

\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\r\n\u001b[39m \u001b[2m166 \u001b[32;22m+\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m167 \u001b[32;22m+\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m168 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m169 \u001b[32;22m+\u001b[38;2;205;214;244m {% block title %}Сайт{%\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mendblock %}\r\n\u001b[39m \u001b[2m170 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m171 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m172 \u001b[32;22m+\u001b[38;2;205;214;244m
\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
\r\n\u001b[39m \u001b[2m175 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m176 \u001b[32;22m+\u001b[38;2;205;214;244m\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\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

Посты

\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 \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 \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\r\n\u001b[39m \u001b[2m215 \u001b[32;22m+\u001b[38;2;205;214;244m\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\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\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\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\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\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(\"/\", 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//\", 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//\", 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" ] }