diff --git a/.obsidian/plugins/obsidian-linter/data.json b/.obsidian/plugins/obsidian-linter/data.json index 2c9b312..fe2e16e 100644 --- a/.obsidian/plugins/obsidian-linter/data.json +++ b/.obsidian/plugins/obsidian-linter/data.json @@ -70,7 +70,7 @@ "update-on-file-contents-updated": "after 10 seconds" }, "yaml-title": { - "enabled": true, + "enabled": false, "title-key": "title", "mode": "first-h1-or-filename-if-h1-missing" }, diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index fd1b4ef..c949124 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -8,20 +8,51 @@ "type": "tabs", "children": [ { - "id": "6ee40f9ce4325b62", + "id": "a6d6c0017e5deaae", "type": "leaf", - "pinned": true, "state": { - "type": "markdown", + "type": "terminal:terminal", "state": { - "file": "90 Library/Programming/Web/Основы веб-разработки.md", - "mode": "preview", - "source": false, - "backlinks": false + "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": 89, + "data": "\r\n \u001b[38;5;74m▝\u001b[38;5;110m▜\u001b[38;5;140m▄\u001b[38;5;139m \u001b[38;5;174m \u001b[0m \u001b[38;5;231;1mGemini CLI\u001b[38;5;248;22m v0.44.0\r\n\u001b[0m \u001b[38;5;74m \u001b[38;5;110m \u001b[38;5;140m▝\u001b[38;5;139m▜\u001b[38;5;174m▄\r\n\u001b[0m \u001b[38;5;74m \u001b[38;5;110m▗\u001b[38;5;140m▟\u001b[38;5;139m▀\u001b[38;5;174m \u001b[0m \u001b[38;5;231;1mSigned in with Google\u001b[38;5;248;22m /auth\r\n\u001b[0m \u001b[38;5;74m▝\u001b[38;5;110m▀\u001b[38;5;140m \u001b[38;5;139m \u001b[38;5;174m \u001b[0m \u001b[38;5;231;1mPlan:\u001b[22m Gemini Code Assist in Google One AI Pro\u001b[38;5;248m /upgrade\r\n\r\n\r\n\u001b[38;5;229mℹ MCP issues detected. Run /mcp list for status.\r\n\u001b[38;5;217m✕ Automatic update failed. Please try updating manually:\r\n\r\n\u001b[0m \u001b[38;5;217mnpm install -g @google/gemini-cli@0.44.1\r\n\r\n\r\n\u001b[38;5;229mℹ Gemini CLI update available! 0.44.0 → 0.44.1\r\n\u001b[0m \u001b[38;5;229mInstalled with npm. Attempting to automatically update now...\r\n\u001b[39;48;5;60m \r\n \u001b[38;5;183m> \u001b[38;5;231mДавай поменяем ненмого концепцию, в шаблонах и во frontmatter всех заметок есть title\u001b[39m \r\n \u001b[38;5;231m- который сейчас бесполезен\u001b[39m \r\n \u001b[38;5;231mДавай заменим его на alias, и сделаем такую схему \u001b[39m \r\n \u001b[38;5;231mВ названии - оставляем такое же название, а alias - удобный псевдоним для поиска и\u001b[39m \r\n \u001b[38;5;231mиндексации, пройдись по всем файлам так\u001b[39m \r\n \r\n\u001b[0m\r\n\u001b[38;5;229mℹ No background tasks are currently active.\r\n\r\n\u001b[0m \u001b[38;5;231;1mРефакторинг frontmatter: title -> alias (Исследование): \r\n\u001b[0m \u001b[38;5;248mИсследование текущей структуры заметок и шаблонов для замены поля title на alias.\r\n\r\n\u001b[38;5;102m╭───────────────────────────────────────────────────────────────────────────────────╮\r\n│\u001b[0m \u001b[38;5;194m✓\u001b[0m \u001b[38;5;231;1mEnter Plan Mode\u001b[0m \u001b[38;5;248mЗамена поля frontmatter во всех заметках хранилища — это масш\u001b[0m… \u001b[38;5;102m│\r\n│\u001b[0m \u001b[38;5;102m│\r\n│\u001b[0m \u001b[38;5;231mSwitching to Plan mode: Замена поля frontmatter во всех заметках хранилища — это\u001b[0m \u001b[38;5;102m│\r\n│\u001b[0m \u001b[38;5;231mмасштабное изменение, требующее тщательного планирования, проверки шаблонов и\u001b[0m \u001b[38;5;102m│\r\n│\u001b[0m \u001b[38;5;231mобновления индекса.\u001b[0m \u001b[38;5;102m│\r\n╰───────────────────────────────────────────────────────────────────────────────────╯\r\n\u001b[0m \u001b[38;5;194m✓\u001b[0m \u001b[38;5;231;1mReadFolder \u001b[0m \u001b[38;5;248m99 System/Template/\u001b[0m \u001b[38;5;183m→ Found 5 item(s).\r\n\u001b[0m \u001b[38;5;194m✓\u001b[0m \u001b[38;5;231;1mFindFiles \u001b[0m \u001b[38;5;248m'90 Library/**/*.md'\u001b[0m \u001b[38;5;183m→ Found 250 matching file(s)\r\n\u001b[0m \u001b[38;5;194m✓\u001b[0m \u001b[38;5;231;1mReadFile \u001b[0m \u001b[38;5;248m99 System/INDEX.md\r\n\u001b[0m \u001b[38;5;194m✓\u001b[0m \u001b[38;5;231;1mReadFolder \u001b[0m \u001b[38;5;248m99 System/Template/\u001b[0m \u001b[38;5;183m→ Found 5 item(s).\r\n\u001b[0m \u001b[38;5;194m✓\u001b[0m \u001b[38;5;231;1mFindFiles \u001b[0m \u001b[38;5;248m'90 Library/**/*.md'\u001b[0m \u001b[38;5;183m→ Found 250 matching file(s)\r\n\u001b[0m \u001b[38;5;194m✓\u001b[0m \u001b[38;5;231;1mReadFile \u001b[0m \u001b[38;5;248m99 System/Template/Base Note.md\r\n\u001b[0m \u001b[38;5;194m✓\u001b[0m \u001b[38;5;231;1mReadFile \u001b[0m \u001b[38;5;248m99 System/Template/Study Item.md\r\n\u001b[0m \u001b[38;5;194m✓\u001b[0m \u001b[38;5;231;1mReadFile \u001b[0m \u001b[38;5;248m90 Library/.../DevOps - основы.md\r\n\u001b[0m \u001b[38;5;194m✓\u001b[0m \u001b[38;5;231;1mReadFile \u001b[0m \u001b[38;5;248m90 Library/.../Персептрон.md\r\n\u001b[0m \u001b[38;5;194m✓\u001b[0m \u001b[38;5;231;1mSearchText \u001b[0m \u001b[38;5;248m'title' within ./\u001b[0m \u001b[38;5;183m→ Found 100 matches (limited)\r\n\u001b[0m \u001b[38;5;194m✓\u001b[0m \u001b[38;5;231;1mReadFile \u001b[0m \u001b[38;5;248mAGENTS.md\r\n\r\n\u001b[38;5;183m✦ \u001b[38;5;231mЯ изучил структуру вашего хранилища и готов приступить к рефакторингу.\r\n\r\n\u001b[0m \u001b[38;5;231;1mЧто я обнаружил:\r\n\u001b[0m \u001b[38;5;231m1. \u001b[1mШаблоны:\u001b[22m В \u001b[38;5;183m99 System/Template/\u001b[38;5;231m все шаблоны содержат поле \u001b[38;5;183mtitle\u001b[38;5;231m. Оно либо пустое,\r\n\u001b[0m \u001b[38;5;231mлибо дублирует название типа заметки.\r\n\u001b[0m \u001b[38;5;231m2. \u001b[1mЗаметки:\u001b[22m В большинстве из 467 заметок поле \u001b[38;5;183mtitle\u001b[38;5;231m дублирует имя файла или содержит\r\n\u001b[0m \u001b[38;5;231mрасширенное описание.\r\n\u001b[0m \u001b[38;5;231m3. \u001b[1mAGENTS.md:\u001b[22m В инструкциях поле \u001b[38;5;183mtitle\u001b[38;5;231m указано как обязательное.\r\n\u001b[0m \u001b[38;5;231m4. \u001b[1mINDEX.md:\u001b[22m Ваш главный индекс использует \u001b[38;5;183mtitle\u001b[38;5;231m для отображения в таблицах.\r\n\r\n\u001b[0m \u001b[38;5;231;1mПредлагаемая стратегия:\r\n\u001b[0m \u001b[38;5;231m1. \u001b[1mИнструкции (\u001b[38;5;183mAGENTS.md\u001b[38;5;231m):\u001b[22m Обновлю правила, заменив обязательный \u001b[38;5;183mtitle\u001b[38;5;231m на \u001b[38;5;183malias\u001b[38;5;231m.\r\n\u001b[0m \u001b[38;5;231m2. \u001b[1mШаблоны:\u001b[22m Во всех шаблонах в \u001b[38;5;183m99 System/Template/\u001b[38;5;231m заменю \u001b[38;5;183mtitle\u001b[38;5;231m на \u001b[38;5;183malias: []\u001b[38;5;231m.\r\n\u001b[0m \u001b[38;5;231m3. \u001b[1mМассовая правка заметок:\u001b[22m Пройдусь по всем \u001b[38;5;183m.md\u001b[38;5;231m файлам и заменю \u001b[38;5;183mtitle: Значение\u001b[38;5;231m на\r\n\u001b[0m \u001b[38;5;183malias: [Значение]\u001b[38;5;231m. Если значение пустое, будет \u001b[38;5;183malias: []\u001b[38;5;231m.\r\n\u001b[0m \u001b[38;5;231m4. \u001b[1mОбновление индекса:\u001b[22m Перегенерирую \u001b[38;5;183m99 System/INDEX.md\u001b[38;5;231m, чтобы он подтягивал данные из\r\n\u001b[0m \u001b[38;5;231mнового поля и отображал колонку \u001b[38;5;183mAlias\u001b[38;5;231m.\r\n\r\n\u001b[0m \u001b[38;5;231;1mВажный момент:\u001b[22m В Obsidian стандартным полем для псевдонимов является \u001b[38;5;183maliases\u001b[38;5;231m (во\r\n\u001b[0m \u001b[38;5;231mмножественном числе). Вы просили именно \u001b[38;5;183malias\u001b[38;5;231m. Я сделаю \u001b[38;5;183malias\u001b[38;5;231m, как вы и просили, но\r\n\u001b[0m \u001b[38;5;231mесли вы имели в виду стандартный механизм Obsidian, дайте знать.\r\n\r\n\u001b[0m \u001b[38;5;231mЕсли стратегия верна, я составлю детальный план и приступлю.\r\n\u001b[39;48;5;60m \r\n \u001b[38;5;183m> \u001b[38;5;231mа что из себя представляет стандартный механизм?\u001b[39m \r\n \r\n\u001b[38;5;183;49m✦ \u001b[38;5;231mСтандартный механизм Obsidian использует поле \u001b[38;5;183;1maliases\u001b[38;5;231;22m (во множественном числе).\u001b[8X\r\n\r\n\u001b[0m \u001b[38;5;231;1mКак это работает в Obsidian:\r\n\u001b[0m \u001b[38;5;231m1. \u001b[1mФормат:\u001b[22m \r\n\r\n\u001b[0m \u001b[38;5;248m1\u001b[0m \u001b[38;5;231m \u001b[38;5;152maliases:\u001b[38;5;231m [\u001b[38;5;229mПсевдоним1\u001b[38;5;231m, \u001b[38;5;229mПсевдоним2\u001b[38;5;231m]\r\n\u001b[0m \u001b[38;5;248m2\u001b[0m \u001b[38;5;231m \u001b[38;5;248m# или\r\n\u001b[0m \u001b[38;5;248m3\u001b[0m \u001b[38;5;231m \u001b[38;5;152maliases:\r\n\u001b[0m \u001b[38;5;248m4\u001b[0m \u001b[38;5;231m \u001b[38;5;229m-\u001b[38;5;231m \u001b[38;5;229mПсевдоним1\r\n\u001b[0m \u001b[38;5;248m5\u001b[0m \u001b[38;5;231m \u001b[38;5;229m-\u001b[38;5;231m \u001b[38;5;229mПсевдоним2\r\n\u001b[0m \u001b[38;5;231m2. \u001b[1mПоиск:\u001b[22m При нажатии \u001b[38;5;183mCtrl+O\u001b[38;5;231m (быстрый переход) Obsidian ищет заметку не только по\r\n\u001b[0m \u001b[38;5;231mимени файла, но и по всем значениям из этого списка.\r\n\u001b[0m \u001b[38;5;231m3. \u001b[1mСсылки:\u001b[22m При создании ссылки \u001b[38;5;183m[[имя_файла|\u001b[38;5;231m Obsidian предложит автодополнение из\r\n\u001b[0m \u001b[38;5;231mсписка псевдонимов. Это позволяет, например, иметь файл \u001b[38;5;183mПерсептрон.md\u001b[38;5;231m, а ссылаться\r\n\u001b[0m \u001b[38;5;231mна него как \u001b[38;5;183m[[Персептрон|перцептроны]]\u001b[38;5;231m, если этот вариант указан в списке.\r\n\u001b[0m \u001b[38;5;231m4. \u001b[1mГраф:\u001b[22m В графе и других визуализациях по умолчанию отображается имя файла, но\r\n\u001b[0m \u001b[38;5;231mпсевдонимы помогают системе «понимать», что разные слова ведут к одной сущности.\r\n\r\n\u001b[0m \u001b[38;5;231;1mКак это соотносится с вашей идеей:\r\n\u001b[0m \u001b[38;5;231mВаше предложение заменить \u001b[38;5;183mtitle\u001b[38;5;231m на псевдоним идеально ложится в логику Obsidian, если\r\n\u001b[0m \u001b[38;5;231mиспользовать именно ключ \u001b[38;5;183;1maliases\u001b[38;5;231;22m. \r\n\r\n\u001b[0m \u001b[38;5;231;1mКак лучше сделать в вашем случае:\r\n\u001b[0m \u001b[38;5;231m* \u001b[1mИмя файла:\u001b[22m Остается уникальным идентификатором (например, \u001b[38;5;183mDocker Swarm.md\u001b[38;5;231m).\r\n\u001b[0m \u001b[38;5;231m* \u001b[1mПоле \u001b[38;5;183maliases\u001b[38;5;231m:\u001b[22m Сюда мы перенесем то, что сейчас в \u001b[38;5;183mtitle\u001b[38;5;231m. Это позволит вам искать\r\n\u001b[0m \u001b[38;5;231mзаметку по «красивому» названию, даже если имя файла техническое или сокращенное.\r\n\r\n\u001b[0m \u001b[38;5;231;1mРекомендую использовать именно \u001b[38;5;183maliases\u001b[38;5;231;22m, так как это обеспечит нативную поддержку всеми\r\n\u001b[0m \u001b[38;5;231mплагинами и самой программой.\r\n\r\n\u001b[0m \u001b[38;5;231mДелаем через \u001b[38;5;183maliases\u001b[38;5;231m?\r\n\u001b[39;48;5;60m \r\n \u001b[38;5;183m> \u001b[38;5;231mдавай aliases\u001b[39m \r\n \r\n\u001b[0m\u001b[89X\r\n \u001b[38;5;231;1mРефакторинг frontmatter: title -> aliases (Планирование): \r\n\u001b[0m \u001b[38;5;248mПодготовка детального плана замены поля title на aliases во всем хранилище.\r\n\r\n\r\n\u001b[38;5;183m✦ \u001b[38;5;231mОтличный выбор. Использование стандартного поля \u001b[38;5;183maliases\u001b[38;5;231m сделает хранилище более\r\n\u001b[0m \u001b[38;5;231mсовместимым с экосистемой Obsidian.\r\n\r\n\u001b[0m \u001b[38;5;231mЯ подготовил план рефакторинга:\r\n\r\n\u001b[0m \u001b[38;5;231;1mПлан: Рефакторинг frontmatter \u001b[38;5;183mtitle\u001b[38;5;231m -> \u001b[38;5;183maliases\r\n\r\n\u001b[0m \u001b[38;5;248;3m1. Инструкции (\u001b[38;5;183mAGENTS.md\u001b[38;5;248m)\r\n\u001b[0m \u001b[38;5;231m* Заменю \u001b[38;5;183mtitle\u001b[38;5;231m на \u001b[38;5;183maliases\u001b[38;5;231m в списке обязательных полей.\r\n\u001b[0m \u001b[38;5;231m* Обновлю описание: \u001b[38;5;183maliases\u001b[38;5;231m теперь будет хранить список псевдонимов, включая прежний\r\n\u001b[0m \u001b[38;5;231mзаголовок.\r\n\r\n\u001b[0m \u001b[38;5;248;3m2. Шаблоны (\u001b[38;5;183m99 System/Template/\u001b[38;5;248m)\r\n\u001b[0m \u001b[38;5;231m* Во всех шаблонах (\u001b[38;5;183mBase Note\u001b[38;5;231m, \u001b[38;5;183mStudy Item\u001b[38;5;231m, \u001b[38;5;183mDaily Note\u001b[38;5;231m и др.) заменю строку \u001b[38;5;183mtitle: ...\r\n\u001b[0m \u001b[38;5;231mна \u001b[38;5;183maliases: []\u001b[38;5;231m.\r\n\r\n\u001b[0m \u001b[38;5;248;3m3. Массовая миграция (467+ файлов)\r\n\u001b[0m \u001b[38;5;231m* Пройдусь по всем заметкам.\r\n\u001b[0m \u001b[38;5;231m* Если в \u001b[38;5;183mtitle\u001b[38;5;231m есть текст, он превратится в \u001b[38;5;183maliases: [Текст]\u001b[38;5;231m.\r\n\u001b[0m \u001b[38;5;231m* Если \u001b[38;5;183mtitle\u001b[38;5;231m пустой, будет \u001b[38;5;183maliases: []\u001b[38;5;231m.\r\n\u001b[0m \u001b[38;5;231m* Поле \u001b[38;5;183mtitle\u001b[38;5;231m будет полностью удалено из YAML.\r\n\r\n\u001b[0m \u001b[38;5;248;3m4. Индексация (\u001b[38;5;183m99 System/INDEX.md\u001b[38;5;248m)\r\n\u001b[0m \u001b[38;5;231m* Пересоберу главный индекс. Таблицы будут отображать колонку \u001b[38;5;183mAliases\u001b[38;5;231m вместо \u001b[38;5;183mTitle\u001b[38;5;231m.\r\n\r\n\u001b[0m \u001b[38;5;248;3m5. Системные файлы\r\n\u001b[0m \u001b[38;5;231m* Обновлю \u001b[38;5;183mGEMINI.md\u001b[38;5;231m, чтобы он соответствовал новому стандарту.\r\n\r\n\u001b[0m \u001b[2m---\r\n\u001b[0m \u001b[38;5;231;1mГотов приступить к выполнению?\u001b[22m Если да, я начну с обновления \u001b[38;5;183mAGENTS.md\u001b[38;5;231m и шаблонов, а\r\n\u001b[0m \u001b[38;5;231mзатем перейду к массовой обработке.\r\n\r\n\r\n\r\n\u001b[38;5;102;2m─────────────────────────────────────────────────────────────────────────────────────────\r\n\u001b[0m \u001b[38;5;194mplan\u001b[38;5;248m Shift+Tab to manual\u001b[0m \u001b[38;5;248m2 GEMINI.md files · 2 MCP servers\r\n\u001b[39;48;5;60m \r\n \u001b[38;5;194m> \u001b[38;5;231mДавай, дел\u001b[39;7m \u001b[27m \r\n \r\n\u001b[0m \u001b[38;5;248mworkspace (/directory)\u001b[0m \u001b[38;5;248mbranch\u001b[0m \u001b[38;5;248msandbox\u001b[0m \u001b[38;5;248m/model\u001b[0m \u001b[38;5;248mquota\u001b[1X\r\n\u001b[0m \u001b[38;5;231m~/.../Vaults/SecondBrain\u001b[0m \u001b[38;5;231mmain\u001b[0m \u001b[38;5;217mno sandbox\u001b[0m \u001b[38;5;231mgemini-3-flash-preview\u001b[0m 19% used\r\n\u001b[4A\u001b[13C", + "rows": 34, + "scrollLine": -1 + } + } }, - "pinned": true, - "icon": "lucide-file", - "title": "Основы веб-разработки" + "icon": "terminal", + "title": "Terminal: ◇ Ready (SecondBrain)" } }, { @@ -39,8 +70,7 @@ "title": "Django: Представления, шаблоны и CBV" } } - ], - "currentTab": 1 + ] } ], "direction": "vertical" @@ -162,7 +192,7 @@ "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[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;22mORM.md'\r\n\u001b[39;2m └ .../Programming/Python/Django: Модели и\r\n\u001b[0m \u001b[2mORM.md | 115 ++++++++++++++++++++-\r\n\u001b[0m \u001b[2m 1 file changed, 111 insertions(+), 4\r\n\u001b[0m \u001b[2mdeletions(-)\r\n\r\n•\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[36m90 Library/Programming/Python/Django:\r\n\u001b[0m \u001b[36mМодели и ORM.md:14\u001b[0m добавил примеры для\r\n остальных блоков:\r\n\r\n - структура проекта;\r\n - типы полей;\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[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", + "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[1C\u001b[1;22mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[1C\u001b[0mDjango:\u001b[1CПредставления,\u001b[1Cшаблоны\u001b[1Cи\r\nCBV.md\r\n\r\n•\u001b[1C\u001b[1mWorki\u001b[0mn\u001b[2mg\u001b[1C(23s • esc to interrupt)\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": -1 } @@ -170,7 +200,7 @@ }, "pinned": true, "icon": "terminal", - "title": "Terminal: SecondBrain" + "title": "Terminal: ⠋ SecondBrain" } }, { @@ -226,65 +256,15 @@ "state": { "type": "outline", "state": { - "file": "90 Library/Programming/Web/Основы HTML (структура, таблицы, формы).md", "followCursor": false, "showSearch": false, "searchQuery": "" }, "icon": "lucide-list", - "title": "Outline of Основы HTML (структура, таблицы, формы)" - } - }, - { - "id": "a6d6c0017e5deaae", - "type": "leaf", - "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": "\u001b[33m⚠ Последний бэкап: 2 дн. назад. Запусти: backup-menu\r\n\u001b[38;5;244m╭─\u001b[30m \u001b[0m \u001b[38;5;31m \u001b[38;5;39;1m~\u001b[38;5;31;22m/\u001b[38;5;103mDoc\u001b[38;5;31m/\u001b[38;5;103mV\u001b[38;5;31m/\u001b[38;5;39;1mSecondBrain\u001b[38;5;31;22m \u001b[0mon \u001b[38;5;76m\u001b[38;5;178m \u001b[38;5;76m main \u001b[38;5;178m!7\r\n\u001b[38;5;244m╰─\u001b[38;5;76m❯\u001b[0m ", - "rows": 34, - "scrollLine": 0 - } - } - }, - "icon": "terminal", - "title": "Terminal: ZSH" + "title": "Outline" } } - ], - "currentTab": 5 + ] } ], "direction": "horizontal", diff --git a/90 Library/Programming/Python/Django: Представления, шаблоны и CBV.md b/90 Library/Programming/Python/Django: Представления, шаблоны и CBV.md index 74119c2..13804d6 100644 --- a/90 Library/Programming/Python/Django: Представления, шаблоны и CBV.md +++ b/90 Library/Programming/Python/Django: Представления, шаблоны и CBV.md @@ -1,14 +1,14 @@ --- -status: seed +status: processing type: concept tags: [django, routing, templates, cbv, fbv] created: 2026-05-30 updated: 2026-05-31 -title: "Django: Представления и Шаблоны" +title: "Django: Представления, шаблоны и CBV" source: ["[[lec2-django_lec_urls_views_templates-1.pdf]]", "[[lec3-django_cbv-1.pdf]]", "[[p4-django_cbv-1.pdf]]"] --- -# Django: Представления и Шаблоны +# Django: Представления, шаблоны и CBV ## Маршрутизация (URL Routing) - Описывается в `urlpatterns` с помощью `path()` и `re_path()`. @@ -16,12 +16,67 @@ source: ["[[lec2-django_lec_urls_views_templates-1.pdf]]", "[[lec3-django_cbv-1. - Включение других файлов: `path('blog/', include('blog.urls'))`. - Реверсирование: `{% url 'name' %}` в шаблонах или `reverse('name')` в Python. +Конвертеры вытаскивают часть URL, проверяют её тип и передают во view как аргумент: +- `` — непустая строка без `/`; используется по умолчанию. +- `` — целое положительное число. +- `` — строка для человекочитаемого URL: буквы, цифры, `_`, `-`. +- `` — UUID, например `075194d3-6885-417e-a8a8-6c931e272f00`. +- `` — строка, которая может содержать `/`. + +Маршрутизация связывает URL с view-функцией или view-классом. Имя маршрута (`name`) нужно, чтобы не хардкодить URL в коде и шаблонах. + +```python +# project/urls.py +from django.urls import include, path + +urlpatterns = [ + path("blog/", include("blog.urls")), +] +``` + +```python +# blog/urls.py +from django.urls import path + +from . import views + +app_name = "blog" + +urlpatterns = [ + path("", views.post_list, name="post_list"), + path("/", views.post_detail, name="post_detail"), + path("tag//", views.posts_by_tag, name="posts_by_tag"), + path("files//", views.file_detail, name="file_detail"), +] +``` + +```python +def post_detail(request, pk): + # pk уже int + ... + + +def posts_by_tag(request, slug): + # slug — строка из URL + ... +``` + +```python +from django.urls import reverse + +url = reverse("blog:post_detail", kwargs={"pk": 1}) +``` + --- ## Представления (Views) - Views принимают `HttpRequest` и возвращают `HttpResponse`. +Views принимают `HttpRequest` и возвращают `HttpResponse`. + +View — это точка входа для запроса. В ней обычно читают данные из БД, проверяют условия и возвращают HTML, JSON, редирект или ошибку. ### Функциональные представления (FBV) +FBV — обычная функция. Удобна, когда логика короткая и нестандартная. + ```python from django.shortcuts import render, get_object_or_404 @@ -30,6 +85,16 @@ def index(request): return render(request, "app/index.html", {"items": latest_items}) ``` +```python +from django.shortcuts import get_object_or_404, render + +from .models import Post + +def post_detail(request, pk): + post = get_object_or_404(Post, pk=pk) + return render(request, "blog/detail.html", {"post": post}) +``` + ### Классовые представления (CBV) Абстрагируют типичные задачи. Вызываются в URL через `.as_view()`. @@ -37,13 +102,48 @@ def index(request): - **ListView:** Автоматический список объектов (данные в `object_list`). - **DetailView:** Детальная информация об одном объекте (ищет по `pk` или `slug`). +CBV — класс с готовым поведением. Django сам вызывает нужные методы класса: например, `get()` для GET-запроса или `get_queryset()` для получения списка объектов. + **Пример ListView:** ```python +from django.views.generic import DetailView, ListView, TemplateView + +from .models import Post + + +class AboutView(TemplateView): + template_name = "blog/about.html" + + class PostListView(ListView): model = Post template_name = "blog/list.html" context_object_name = "posts" paginate_by = 10 + + def get_queryset(self): + return Post.objects.filter(is_published=True).order_by("-created_at") + + +class PostDetailView(DetailView): + model = Post + template_name = "blog/detail.html" + context_object_name = "post" +``` + +```python +# blog/urls.py +from django.urls import path + +from .views import AboutView, PostDetailView, PostListView + +app_name = "blog" + +urlpatterns = [ + path("about/", AboutView.as_view(), name="about"), + path("", PostListView.as_view(), name="post_list"), + path("/", PostDetailView.as_view(), name="post_detail"), +] ``` --- @@ -56,14 +156,85 @@ class PostListView(ListView): - **Теги:** `{% if %}`, `{% for %}`, `{% url %}`, `{% csrf_token %}`. - **Фильтры:** `{{ date|date:"Y-m-d" }}`, `{{ list|length }}`, `{{ text|lower }}`. +Шаблон получает контекст из view. Например, если view передала `{"posts": posts}`, в шаблоне доступна переменная `posts`. + +```html +{% for post in posts %} + +{% empty %} +

Постов нет.

+{% endfor %} +``` + ### Наследование шаблонов Позволяет избежать дублирования HTML-кода. - **Базовый шаблон (`base.html`):** Определяет блоки `{% block content %}{% endblock %}`. - **Дочерний шаблон:** Использует `{% extends "base.html" %}` и переопределяет блоки. +```html + + + + + {% block title %}Сайт{% endblock %} + + +
+ {% block content %}{% endblock %} +
+ + +``` + +```html + +{% extends "base.html" %} + +{% block title %}Посты{% endblock %} + +{% block content %} +

Посты

+ + {% for post in posts %} + + {{ post.title }} + + {% endfor %} +{% endblock %} +``` + --- ## Статические файлы (Static) - Подключаются через `{% load static %}`. - Настройки в `settings.py`: `STATIC_URL`, `STATICFILES_DIRS`. - В продакшне используется команда `python manage.py collectstatic`. + +Статика — это CSS, JavaScript, изображения и другие файлы, которые не генерируются view. + +```python +# settings.py +STATIC_URL = "static/" +STATICFILES_DIRS = [BASE_DIR / "static"] +``` + +```html +{% load static %} + + + +``` + +```bash +python manage.py collectstatic +``` diff --git a/99 System/INDEX.md b/99 System/INDEX.md index b6ab68d..649d66a 100644 --- a/99 System/INDEX.md +++ b/99 System/INDEX.md @@ -522,7 +522,7 @@ total: 467 | Заметка | Title | Status | Type | Tags | |---------|-------|--------|------|------| | [[Django: Модели и ORM]] | Django: Модели и ORM | processing | concept | [django, backend, orm, database, migrations] | -| [[Django: Представления, шаблоны и CBV]] | Django: Представления, шаблоны и CBV | seed | concept | [django, routing, templates, cbv, fbv] | +| [[Django: Представления, шаблоны и CBV]] | Django: Представления, шаблоны и CBV | processing | concept | [django, routing, templates, cbv, fbv] | | [[Django: Работа с формами и CUD]] | Django: Работа с формами и CUD | seed | concept | [django, forms, crud, validation, modelform] | | [[Python - MOC]] | Python - MOC | seed | moc | [programming, python] | | [[Python: Базовый синтаксис и основы]] | Python: Базовый синтаксис и основы | seed | concept | [python, syntax, programming-basics, functional-programming] |