[{"data":1,"prerenderedAt":9118},["ShallowReactive",2],{"navigation":3,"/performance-and-optimization/query-optimization":1016,"/performance-and-optimization/query-optimization-surround":9113},[4,54,89,123,165,211,253,331,389,439,462,488,514,540,578,624,650,672,702,736,774,800,850,856,862,868,874,928],{"title":5,"path":6,"stem":7,"children":8},"Introduction and Foundations","/introduction-and-foundations","01.introduction-and-foundations/01.index",[9,10,14,18,22,26,30,34,38,42,46,50],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"What is Django","/introduction-and-foundations/what-is-django","01.introduction-and-foundations/02.what-is-django",{"title":15,"path":16,"stem":17},"Key Concepts and Philosophy","/introduction-and-foundations/key-concepts-and-philosophy","01.introduction-and-foundations/03.key-concepts-and-philosophy",{"title":19,"path":20,"stem":21},"MVC vs MVT: Understanding Django's Architecture","/introduction-and-foundations/mvc-vs-mvt","01.introduction-and-foundations/04.mvc-vs-mvt",{"title":23,"path":24,"stem":25},"Project Structure Overview","/introduction-and-foundations/project-structure-overview","01.introduction-and-foundations/05.project-structure-overview",{"title":27,"path":28,"stem":29},"Installing Django","/introduction-and-foundations/installing-django","01.introduction-and-foundations/06.installing-django",{"title":31,"path":32,"stem":33},"Creating Your First Django Project","/introduction-and-foundations/creating-first-project","01.introduction-and-foundations/07.creating-first-project",{"title":35,"path":36,"stem":37},"Creating Your First Django App","/introduction-and-foundations/creating-first-app","01.introduction-and-foundations/08.creating-first-app",{"title":39,"path":40,"stem":41},"Your First Django \"Hello World\"","/introduction-and-foundations/hello-world","01.introduction-and-foundations/09.hello-world",{"title":43,"path":44,"stem":45},"Django Quick Start Guide","/introduction-and-foundations/quick-start-guide","01.introduction-and-foundations/10.quick-start-guide",{"title":47,"path":48,"stem":49},"How Django Handles Requests","/introduction-and-foundations/how-django-handles-requests","01.introduction-and-foundations/11.how-django-handles-requests",{"title":51,"path":52,"stem":53},"Django Settings","/introduction-and-foundations/django-settings","01.introduction-and-foundations/12.django-settings",{"title":55,"path":56,"stem":57,"children":58},"The Development Environment","/development-environment","02.development-environment/1.index",[59,61,65,69,73,77,81,85],{"title":60,"path":56,"stem":57},"Development Environment",{"title":62,"path":63,"stem":64},"Recommended Tooling for Django Development","/development-environment/recommended-tooling","02.development-environment/2.recommended-tooling",{"title":66,"path":67,"stem":68},"Virtual Environments","/development-environment/virtual-environments","02.development-environment/3.virtual-environments",{"title":70,"path":71,"stem":72},"Django Admin and Management Commands","/development-environment/admin-and-management-commands","02.development-environment/4.admin-and-management-commands",{"title":74,"path":75,"stem":76},"Django Project Settings","/development-environment/project-settings","02.development-environment/5.project-settings",{"title":78,"path":79,"stem":80},"Managing Django Environments: Local, Staging, and Production","/development-environment/environments-local-staging-production","02.development-environment/6.environments-local-staging-production",{"title":82,"path":83,"stem":84},"Running Django Development Server","/development-environment/running-development-server","02.development-environment/7.running-development-server",{"title":86,"path":87,"stem":88},"Working with Django Shell","/development-environment/working-with-shell","02.development-environment/8.working-with-shell",{"title":90,"path":91,"stem":92,"children":93},"Templates and Presentation Layer","/templates-and-presentation","03.templates-and-presentation/1.index",[94,95,99,103,107,111,115,119],{"title":90,"path":91,"stem":92},{"title":96,"path":97,"stem":98},"Introduction to Django Templates","/templates-and-presentation/introduction-to-templates","03.templates-and-presentation/2.introduction-to-templates",{"title":100,"path":101,"stem":102},"The Django Template Language","/templates-and-presentation/django-template-language","03.templates-and-presentation/3.django-template-language",{"title":104,"path":105,"stem":106},"Template Inheritance","/templates-and-presentation/template-inheritance","03.templates-and-presentation/4.template-inheritance",{"title":108,"path":109,"stem":110},"Built-in Template Tags and Filters","/templates-and-presentation/built-in-template-tags-and-filters","03.templates-and-presentation/5.built-in-template-tags-and-filters",{"title":112,"path":113,"stem":114},"Including Static Files","/templates-and-presentation/including-static-files","03.templates-and-presentation/6.including-static-files",{"title":116,"path":117,"stem":118},"Working with Media Files","/templates-and-presentation/working-with-media-files","03.templates-and-presentation/7.working-with-media-files",{"title":120,"path":121,"stem":122},"Using Alternative Template Engines","/templates-and-presentation/using-alternative-template-engines","03.templates-and-presentation/8.using-alternative-template-engines",{"title":124,"path":125,"stem":126,"children":127},"URLs and Views","/urls-and-views","04.urls-and-views/01.index",[128,129,133,137,141,145,149,153,157,161],{"title":124,"path":125,"stem":126},{"title":130,"path":131,"stem":132},"The URL Dispatcher","/urls-and-views/the-url-dispatcher","04.urls-and-views/02.the-url-dispatcher",{"title":134,"path":135,"stem":136},"Writing Function-Based Views","/urls-and-views/writing-function-based-views","04.urls-and-views/03.writing-function-based-views",{"title":138,"path":139,"stem":140},"View Decorators","/urls-and-views/view-decorators","04.urls-and-views/04.view-decorators",{"title":142,"path":143,"stem":144},"Rendering Responses","/urls-and-views/rendering-responses","04.urls-and-views/05.rendering-responses",{"title":146,"path":147,"stem":148},"Redirects","/urls-and-views/redirects","04.urls-and-views/06.redirects",{"title":150,"path":151,"stem":152},"Handling HTTP Methods","/urls-and-views/handling-http-methods","04.urls-and-views/07.handling-http-methods",{"title":154,"path":155,"stem":156},"Conditional View Processing","/urls-and-views/conditional-view-processing","04.urls-and-views/08.conditional-view-processing",{"title":158,"path":159,"stem":160},"File Uploads","/urls-and-views/file-uploads","04.urls-and-views/09.file-uploads",{"title":162,"path":163,"stem":164},"Using Django Shortcut Functions","/urls-and-views/using-django-shortcut-functions","04.urls-and-views/10.using-django-shortcut-functions",{"title":166,"path":167,"stem":168,"children":169},"Class Based Views","/class-based-views","05.class-based-views/01.index",[170,171,175,179,183,187,191,195,199,203,207],{"title":166,"path":167,"stem":168},{"title":172,"path":173,"stem":174},"Introduction to Class-Based Views","/class-based-views/introduction-to-class-based-views","05.class-based-views/02.introduction-to-class-based-views",{"title":176,"path":177,"stem":178},"Common Base Classes","/class-based-views/common-base-classes","05.class-based-views/03.common-base-classes",{"title":180,"path":181,"stem":182},"Built-in Generic Views","/class-based-views/built-in-generic-views","05.class-based-views/04.built-in-generic-views",{"title":184,"path":185,"stem":186},"Views for CRUD Operations","/class-based-views/views-for-crud-operations","05.class-based-views/05.views-for-crud-operations",{"title":188,"path":189,"stem":190},"Handling Forms with Class-Based Views","/class-based-views/handling-forms-with-class-based-views","05.class-based-views/06.handling-forms-with-class-based-views",{"title":192,"path":193,"stem":194},"Using Mixins","/class-based-views/using-mixins","05.class-based-views/07.using-mixins",{"title":196,"path":197,"stem":198},"URL Configuration with Class-Based Views","/class-based-views/url-configuration-with-class-based-views","05.class-based-views/08.url-configuration-with-class-based-views",{"title":200,"path":201,"stem":202},"Subclassing Generic Views","/class-based-views/subclassing-generic-views","05.class-based-views/09.subclassing-generic-views",{"title":204,"path":205,"stem":206},"Asynchronous Class-Based Views","/class-based-views/asynchronous-class-based-views","05.class-based-views/10.asynchronous-class-based-views",{"title":208,"path":209,"stem":210},"Pagination","/class-based-views/pagination","05.class-based-views/11.pagination",{"title":212,"path":213,"stem":214,"children":215},"Forms and User Input","/forms-and-user-input","06.forms-and-user-input/01.index",[216,217,221,225,229,233,237,241,245,249],{"title":212,"path":213,"stem":214},{"title":218,"path":219,"stem":220},"Understanding HTML Forms","/forms-and-user-input/understanding-html-forms","06.forms-and-user-input/02.understanding-html-forms",{"title":222,"path":223,"stem":224},"Django's Role in Form Handling","/forms-and-user-input/djangos-role-in-form-handling","06.forms-and-user-input/03.djangos-role-in-form-handling",{"title":226,"path":227,"stem":228},"Creating Forms with Forms API","/forms-and-user-input/creating-forms-with-forms-api","06.forms-and-user-input/04.creating-forms-with-forms-api",{"title":230,"path":231,"stem":232},"Form Validation","/forms-and-user-input/form-validation","06.forms-and-user-input/05.form-validation",{"title":234,"path":235,"stem":236},"Built-in Fields and Widgets","/forms-and-user-input/built-in-fields-and-widgets","06.forms-and-user-input/06.built-in-fields-and-widgets",{"title":238,"path":239,"stem":240},"Form Rendering in Templates","/forms-and-user-input/form-rendering-in-templates","06.forms-and-user-input/07.form-rendering-in-templates",{"title":242,"path":243,"stem":244},"Model Forms","/forms-and-user-input/model-forms","06.forms-and-user-input/08.model-forms",{"title":246,"path":247,"stem":248},"Advanced Form Techniques","/forms-and-user-input/advanced-form-techniques","06.forms-and-user-input/09.advanced-form-techniques",{"title":250,"path":251,"stem":252},"Security Considerations for Forms","/forms-and-user-input/security-considerations-for-forms","06.forms-and-user-input/10.security-considerations-for-forms",{"title":254,"path":255,"stem":256,"children":257},"Models and Databases","/models-and-databases","07.models-and-databases/01.index",[258,259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327],{"title":254,"path":255,"stem":256},{"title":260,"path":261,"stem":262},"Understanding Django Models","/models-and-databases/understanding-django-models","07.models-and-databases/02.understanding-django-models",{"title":264,"path":265,"stem":266},"Defining Fields","/models-and-databases/defining-fields","07.models-and-databases/03.defining-fields",{"title":268,"path":269,"stem":270},"Relationships and Foreign Keys","/models-and-databases/relationships-and-foreign-keys","07.models-and-databases/04.relationships-and-foreign-keys",{"title":272,"path":273,"stem":274},"Examples of Relationship Patterns","/models-and-databases/examples-of-relationship-patterns","07.models-and-databases/05.examples-of-relationship-patterns",{"title":276,"path":277,"stem":278},"Making Queries","/models-and-databases/making-queries","07.models-and-databases/06.making-queries",{"title":280,"path":281,"stem":282},"Filtering, Ordering, and Slicing","/models-and-databases/filtering-ordering-slicing","07.models-and-databases/07.filtering-ordering-slicing",{"title":284,"path":285,"stem":286},"Managers and QuerySets","/models-and-databases/managers-and-querysets","07.models-and-databases/08.managers-and-querysets",{"title":288,"path":289,"stem":290},"Aggregation","/models-and-databases/aggregation","07.models-and-databases/09.aggregation",{"title":292,"path":293,"stem":294},"Search","/models-and-databases/search","07.models-and-databases/10.search",{"title":296,"path":297,"stem":298},"Raw SQL Queries","/models-and-databases/raw-sql-queries","07.models-and-databases/11.raw-sql-queries",{"title":300,"path":301,"stem":302},"Transactions","/models-and-databases/transactions","07.models-and-databases/12.transactions",{"title":304,"path":305,"stem":306},"Multiple Databases","/models-and-databases/multiple-databases","07.models-and-databases/13.multiple-databases",{"title":308,"path":309,"stem":310},"Tablespaces","/models-and-databases/tablespaces","07.models-and-databases/14.tablespaces",{"title":312,"path":313,"stem":314},"Composite Primary Keys","/models-and-databases/composite-primary-keys","07.models-and-databases/15.composite-primary-keys",{"title":316,"path":317,"stem":318},"Database Instrumentation","/models-and-databases/database-instrumentation","07.models-and-databases/16.database-instrumentation",{"title":320,"path":321,"stem":322},"Database Optimization","/models-and-databases/database-optimization","07.models-and-databases/17.database-optimization",{"title":324,"path":325,"stem":326},"Fixtures","/models-and-databases/fixtures","07.models-and-databases/18.fixtures",{"title":328,"path":329,"stem":330},"Signals","/models-and-databases/signals","07.models-and-databases/19.signals",{"title":332,"path":333,"stem":334,"children":335},"Migrations","/migrations","08.migrations/01.index",[336,337,341,345,349,353,357,361,365,369,373,377,381,385],{"title":332,"path":333,"stem":334},{"title":338,"path":339,"stem":340},"How Migrations Work","/migrations/how-migrations-work","08.migrations/02.how-migrations-work",{"title":342,"path":343,"stem":344},"Management Commands","/migrations/management-commands","08.migrations/03.management-commands",{"title":346,"path":347,"stem":348},"Dependencies and Workflow","/migrations/dependencies-and-workflow","08.migrations/04.dependencies-and-workflow",{"title":350,"path":351,"stem":352},"Transaction Handling","/migrations/transaction-handling","08.migrations/05.transaction-handling",{"title":354,"path":355,"stem":356},"Adding Migrations to Apps","/migrations/adding-migrations-to-apps","08.migrations/06.adding-migrations-to-apps",{"title":358,"path":359,"stem":360},"Reversing Migrations","/migrations/reversing-migrations","08.migrations/07.reversing-migrations",{"title":362,"path":363,"stem":364},"Historical Models","/migrations/historical-models","08.migrations/08.historical-models",{"title":366,"path":367,"stem":368},"Considerations When Removing Fields","/migrations/considerations-when-removing-fields","08.migrations/09.considerations-when-removing-fields",{"title":370,"path":371,"stem":372},"Data Migrations","/migrations/data-migrations","08.migrations/10.data-migrations",{"title":374,"path":375,"stem":376},"Squashing Migrations","/migrations/squashing-migrations","08.migrations/11.squashing-migrations",{"title":378,"path":379,"stem":380},"Serializing Values","/migrations/serializing-values","08.migrations/12.serializing-values",{"title":382,"path":383,"stem":384},"Supporting Multiple Django Versions","/migrations/supporting-multiple-django-versions","08.migrations/13.supporting-multiple-django-versions",{"title":386,"path":387,"stem":388},"Django Serialization Framework","/migrations/django-serialization-framework","08.migrations/14.django-serialization-framework",{"title":390,"path":391,"stem":392,"children":393},"Authentication and Authorization","/authentication-and-authorization","09.authentication-and-authorization/01.index",[394,395,399,403,407,411,415,419,423,427,431,435],{"title":390,"path":391,"stem":392},{"title":396,"path":397,"stem":398},"Overview of Django's Authentication System","/authentication-and-authorization/overview-of-django-authentication-system","09.authentication-and-authorization/02.overview-of-django-authentication-system",{"title":400,"path":401,"stem":402},"Users and Groups","/authentication-and-authorization/users-and-groups","09.authentication-and-authorization/03.users-and-groups",{"title":404,"path":405,"stem":406},"Permissions","/authentication-and-authorization/permissions","09.authentication-and-authorization/04.permissions",{"title":408,"path":409,"stem":410},"Password Management","/authentication-and-authorization/password-management","09.authentication-and-authorization/05.password-management",{"title":412,"path":413,"stem":414},"Authentication Views","/authentication-and-authorization/authentication-views","09.authentication-and-authorization/06.authentication-views",{"title":416,"path":417,"stem":418},"Login and Logout","/authentication-and-authorization/login-and-logout","09.authentication-and-authorization/07.login-and-logout",{"title":420,"path":421,"stem":422},"Custom User Models","/authentication-and-authorization/custom-user-models","09.authentication-and-authorization/08.custom-user-models",{"title":424,"path":425,"stem":426},"Middleware for Authentication","/authentication-and-authorization/middleware-for-authentication","09.authentication-and-authorization/09.middleware-for-authentication",{"title":428,"path":429,"stem":430},"Authorization in Views and Templates","/authentication-and-authorization/authorization-in-views-and-templates","09.authentication-and-authorization/10.authorization-in-views-and-templates",{"title":432,"path":433,"stem":434},"Integrating Social Authentication","/authentication-and-authorization/integrating-social-authentication","09.authentication-and-authorization/11.integrating-social-authentication",{"title":436,"path":437,"stem":438},"Security Best Practices","/authentication-and-authorization/security-best-practices","09.authentication-and-authorization/12.security-best-practices",{"title":440,"path":441,"stem":442,"children":443},"Sessions, Cookies, and State","/sessions-cookies-state","10.sessions-cookies-state/01.index",[444,446,450,454,458],{"title":445,"path":441,"stem":442},"Sessions, Cookies, and State Management",{"title":447,"path":448,"stem":449},"Introduction to Sessions","/sessions-cookies-state/introduction-to-sessions","10.sessions-cookies-state/02.introduction-to-sessions",{"title":451,"path":452,"stem":453},"Working with Cookies","/sessions-cookies-state/working-with-cookies","10.sessions-cookies-state/03.working-with-cookies",{"title":455,"path":456,"stem":457},"Server-Side Session Storage Options","/sessions-cookies-state/server-side-session-storage-options","10.sessions-cookies-state/04.server-side-session-storage-options",{"title":459,"path":460,"stem":461},"Session Security","/sessions-cookies-state/session-security","10.sessions-cookies-state/05.session-security",{"title":463,"path":464,"stem":465,"children":466},"Working with Files","/working-with-files","11.working-with-files/01.index",[467,468,472,476,480,484],{"title":463,"path":464,"stem":465},{"title":469,"path":470,"stem":471},"Files in Models","/working-with-files/files-in-models","11.working-with-files/02.files-in-models",{"title":473,"path":474,"stem":475},"The File Object","/working-with-files/the-file-object","11.working-with-files/03.the-file-object",{"title":477,"path":478,"stem":479},"Storage Backends","/working-with-files/storage-backends","11.working-with-files/04.storage-backends",{"title":481,"path":482,"stem":483},"Using Cloud Storage Providers","/working-with-files/using-cloud-storage-providers","11.working-with-files/05.using-cloud-storage-providers",{"title":485,"path":486,"stem":487},"Managing Media in Production","/working-with-files/managing-media-in-production","11.working-with-files/06.managing-media-in-production",{"title":489,"path":490,"stem":491,"children":492},"Admin Site","/admin-site","12.admin-site/01.index",[493,494,498,502,506,510],{"title":489,"path":490,"stem":491},{"title":495,"path":496,"stem":497},"Enabling the Admin","/admin-site/enabling-the-admin","12.admin-site/02.enabling-the-admin",{"title":499,"path":500,"stem":501},"Registering Models","/admin-site/registering-models","12.admin-site/03.registering-models",{"title":503,"path":504,"stem":505},"Customizing Admin Display","/admin-site/customizing-admin-display","12.admin-site/04.customizing-admin-display",{"title":507,"path":508,"stem":509},"Admin Actions","/admin-site/admin-actions","12.admin-site/05.admin-actions",{"title":511,"path":512,"stem":513},"Admin Security Best Practices","/admin-site/admin-security-best-practices","12.admin-site/06.admin-security-best-practices",{"title":515,"path":516,"stem":517,"children":518},"Middleware","/middleware","13.middleware/01.index",[519,520,524,528,532,536],{"title":515,"path":516,"stem":517},{"title":521,"path":522,"stem":523},"Middleware Overview","/middleware/middleware-overview","13.middleware/02.middleware-overview",{"title":525,"path":526,"stem":527},"Built-in Middleware","/middleware/built-in-middleware","13.middleware/03.built-in-middleware",{"title":529,"path":530,"stem":531},"Creating Custom Middleware","/middleware/creating-custom-middleware","13.middleware/04.creating-custom-middleware",{"title":533,"path":534,"stem":535},"Middleware Ordering","/middleware/middleware-ordering","13.middleware/05.middleware-ordering",{"title":537,"path":538,"stem":539},"Performance and Debugging","/middleware/performance-and-debugging","13.middleware/06.performance-and-debugging",{"title":541,"path":542,"stem":543,"children":544},"Security","/security","14.security/01.index",[545,546,550,554,558,562,566,570,574],{"title":541,"path":542,"stem":543},{"title":547,"path":548,"stem":549},"Django Security Philosophy","/security/django-security-philosophy","14.security/02.django-security-philosophy",{"title":551,"path":552,"stem":553},"Cross Site Request Forgery","/security/cross-site-request-forgery","14.security/03.cross-site-request-forgery",{"title":555,"path":556,"stem":557},"Cross Site Scripting","/security/cross-site-scripting","14.security/04.cross-site-scripting",{"title":559,"path":560,"stem":561},"SQL Injection Protection","/security/sql-injection-protection","14.security/05.sql-injection-protection",{"title":563,"path":564,"stem":565},"Clickjacking Protection","/security/clickjacking-protection","14.security/06.clickjacking-protection",{"title":567,"path":568,"stem":569},"HTTPS Setup and HSTS","/security/https-setup-and-hsts","14.security/07.https-setup-and-hsts",{"title":571,"path":572,"stem":573},"Password Storage and Cryptography","/security/password-storage-and-cryptography","14.security/08.password-storage-and-cryptography",{"title":575,"path":576,"stem":577},"Secure Deployment Checklist","/security/secure-deployment-checklist","14.security/09.secure-deployment-checklist",{"title":579,"path":580,"stem":581,"children":582},"Testing","/testing","15.testing/01.index",[583,584,588,592,596,600,604,608,612,616,620],{"title":579,"path":580,"stem":581},{"title":585,"path":586,"stem":587},"Introduction to Django Testing","/testing/introduction-to-django-testing","15.testing/02.introduction-to-django-testing",{"title":589,"path":590,"stem":591},"Writing and Running Tests","/testing/writing-and-running-tests","15.testing/03.writing-and-running-tests",{"title":593,"path":594,"stem":595},"Test Tools","/testing/test-tools","15.testing/04.test-tools",{"title":597,"path":598,"stem":599},"Testing Models","/testing/testing-models","15.testing/05.testing-models",{"title":601,"path":602,"stem":603},"Testing Views","/testing/testing-views","15.testing/06.testing-views",{"title":605,"path":606,"stem":607},"Testing Forms","/testing/testing-forms","15.testing/07.testing-forms",{"title":609,"path":610,"stem":611},"Testing Templates","/testing/testing-templates","15.testing/08.testing-templates",{"title":613,"path":614,"stem":615},"Testing Authentication","/testing/testing-authentication","15.testing/09.testing-authentication",{"title":617,"path":618,"stem":619},"Advanced Testing Topics","/testing/advanced-testing-topics","15.testing/10.advanced-testing-topics",{"title":621,"path":622,"stem":623},"Performance Testing","/testing/performance-testing","15.testing/11.performance-testing",{"title":625,"path":626,"stem":627,"children":628},"Static Assets and Frontend Integration","/static-assets-and-frontend-integration","16.static-assets-and-frontend-integration/01.index",[629,630,634,638,642,646],{"title":625,"path":626,"stem":627},{"title":631,"path":632,"stem":633},"Working with Static Files","/static-assets-and-frontend-integration/working-with-static-files","16.static-assets-and-frontend-integration/02.working-with-static-files",{"title":635,"path":636,"stem":637},"Integrating CSS and JavaScript","/static-assets-and-frontend-integration/integrating-css-and-javascript","16.static-assets-and-frontend-integration/03.integrating-css-and-javascript",{"title":639,"path":640,"stem":641},"Using Build Tools like Vite or Webpack","/static-assets-and-frontend-integration/using-build-tools-like-vite-or-webpack","16.static-assets-and-frontend-integration/04.using-build-tools-like-vite-or-webpack",{"title":643,"path":644,"stem":645},"Using React or Vue with Django","/static-assets-and-frontend-integration/using-react-or-vue-with-django","16.static-assets-and-frontend-integration/05.using-react-or-vue-with-django",{"title":647,"path":648,"stem":649},"Managing CORS","/static-assets-and-frontend-integration/managing-cors","16.static-assets-and-frontend-integration/06.managing-cors",{"title":651,"path":652,"stem":653,"children":654},"Internationalization and Localization","/internationalization-and-localization","17.internationalization-and-localization/01.index",[655,656,660,664,668],{"title":651,"path":652,"stem":653},{"title":657,"path":658,"stem":659},"Enabling Translation","/internationalization-and-localization/enabling-translation","17.internationalization-and-localization/02.enabling-translation",{"title":661,"path":662,"stem":663},"Translating Text in Code and Templates","/internationalization-and-localization/translating-text-in-code-and-templates","17.internationalization-and-localization/03.translating-text-in-code-and-templates",{"title":665,"path":666,"stem":667},"Timezone Support","/internationalization-and-localization/timezone-support","17.internationalization-and-localization/04.timezone-support",{"title":669,"path":670,"stem":671},"Locale Middleware","/internationalization-and-localization/locale-middleware","17.internationalization-and-localization/05.locale-middleware",{"title":673,"path":674,"stem":675,"children":676},"Caching","/caching","18.caching/01.index",[677,678,682,686,690,694,698],{"title":673,"path":674,"stem":675},{"title":679,"path":680,"stem":681},"Introduction to Caching","/caching/introduction-to-caching","18.caching/02.introduction-to-caching",{"title":683,"path":684,"stem":685},"Cache Backends","/caching/cache-backends","18.caching/03.cache-backends",{"title":687,"path":688,"stem":689},"Per View Caching","/caching/per-view-caching","18.caching/04.per-view-caching",{"title":691,"path":692,"stem":693},"Low Level Cache API","/caching/low-level-cache-api","18.caching/05.low-level-cache-api",{"title":695,"path":696,"stem":697},"Template Fragment Caching","/caching/template-fragment-caching","18.caching/06.template-fragment-caching",{"title":699,"path":700,"stem":701},"Deployment Level Caching Patterns","/caching/deployment-level-caching-patterns","18.caching/07.deployment-level-caching-patterns",{"title":703,"path":704,"stem":705,"children":706},"Asynchronous Django","/asynchronous-django","19.asynchronous-django/01.index",[707,708,712,716,720,724,728,732],{"title":703,"path":704,"stem":705},{"title":709,"path":710,"stem":711},"Introduction to ASGI","/asynchronous-django/introduction-to-asgi","19.asynchronous-django/02.introduction-to-asgi",{"title":713,"path":714,"stem":715},"Async Views","/asynchronous-django/async-views","19.asynchronous-django/03.async-views",{"title":717,"path":718,"stem":719},"Async ORM Status","/asynchronous-django/async-orm-status","19.asynchronous-django/04.async-orm-status",{"title":721,"path":722,"stem":723},"WebSockets with Channels","/asynchronous-django/websockets-with-channels","19.asynchronous-django/05.websockets-with-channels",{"title":725,"path":726,"stem":727},"Background Tasks with Celery or RQ","/asynchronous-django/background-tasks-with-celery-or-rq","19.asynchronous-django/06.background-tasks-with-celery-or-rq",{"title":729,"path":730,"stem":731},"Asynchronous Support","/asynchronous-django/asynchronous-support","19.asynchronous-django/07.asynchronous-support",{"title":733,"path":734,"stem":735},"Django's Tasks Framework","/asynchronous-django/django-tasks-framework","19.asynchronous-django/08.django-tasks-framework",{"title":737,"path":738,"stem":739,"children":740},"Deployment","/deployment","20.deployment/01.index",[741,742,746,750,754,758,762,766,770],{"title":737,"path":738,"stem":739},{"title":743,"path":744,"stem":745},"Preparing for Production","/deployment/preparing-for-production","20.deployment/02.preparing-for-production",{"title":747,"path":748,"stem":749},"Using WSGI and ASGI Servers","/deployment/using-wsgi-and-asgi-servers","20.deployment/03.using-wsgi-and-asgi-servers",{"title":751,"path":752,"stem":753},"Deploying on Linux Servers","/deployment/deploying-on-linux-servers","20.deployment/04.deploying-on-linux-servers",{"title":755,"path":756,"stem":757},"Using Docker","/deployment/using-docker","20.deployment/05.using-docker",{"title":759,"path":760,"stem":761},"Cloud Deployment Guides","/deployment/cloud-deployment-guides","20.deployment/06.cloud-deployment-guides",{"title":763,"path":764,"stem":765},"Scaling and Load Balancing","/deployment/scaling-and-load-balancing","20.deployment/07.scaling-and-load-balancing",{"title":767,"path":768,"stem":769},"Monitoring and Logging","/deployment/monitoring-and-logging","20.deployment/08.monitoring-and-logging",{"title":771,"path":772,"stem":773},"Backup Strategies","/deployment/backup-strategies","20.deployment/09.backup-strategies",{"title":775,"path":776,"stem":777,"children":778},"Performance and Optimization","/performance-and-optimization","21.performance-and-optimization/01.index",[779,780,784,788,792,796],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783},"Query Optimization","/performance-and-optimization/query-optimization","21.performance-and-optimization/02.query-optimization",{"title":785,"path":786,"stem":787},"Template Rendering Optimization","/performance-and-optimization/template-rendering-optimization","21.performance-and-optimization/03.template-rendering-optimization",{"title":789,"path":790,"stem":791},"Using Select Related and Prefetch Related","/performance-and-optimization/using-select-related-and-prefetch-related","21.performance-and-optimization/04.using-select-related-and-prefetch-related",{"title":793,"path":794,"stem":795},"Caching Strategies","/performance-and-optimization/caching-strategies","21.performance-and-optimization/05.caching-strategies",{"title":797,"path":798,"stem":799},"Profiling Django Apps","/performance-and-optimization/profiling-django-apps","21.performance-and-optimization/06.profiling-django-apps",{"title":801,"path":802,"stem":803,"children":804},"Advanced and Expert Topics","/advanced-and-expert-topics","22.advanced-and-expert-topics/01.index",[805,806,810,814,818,822,826,830,834,838,842,846],{"title":801,"path":802,"stem":803},{"title":807,"path":808,"stem":809},"System Architecture Patterns","/advanced-and-expert-topics/system-architecture-patterns","22.advanced-and-expert-topics/02.system-architecture-patterns",{"title":811,"path":812,"stem":813},"Domain Driven Design with Django","/advanced-and-expert-topics/domain-driven-design-with-django","22.advanced-and-expert-topics/03.domain-driven-design-with-django",{"title":815,"path":816,"stem":817},"Building Large Scale Django Projects","/advanced-and-expert-topics/building-large-scale-django-projects","22.advanced-and-expert-topics/04.building-large-scale-django-projects",{"title":819,"path":820,"stem":821},"Plugin Architectures for Django Apps","/advanced-and-expert-topics/plugin-architectures-for-django-apps","22.advanced-and-expert-topics/05.plugin-architectures-for-django-apps",{"title":823,"path":824,"stem":825},"Extending Django's Core","/advanced-and-expert-topics/extending-djangos-core","22.advanced-and-expert-topics/06.extending-djangos-core",{"title":827,"path":828,"stem":829},"Custom ORM Expressions","/advanced-and-expert-topics/custom-orm-expressions","22.advanced-and-expert-topics/07.custom-orm-expressions",{"title":831,"path":832,"stem":833},"Custom Management Commands","/advanced-and-expert-topics/custom-management-commands","22.advanced-and-expert-topics/08.custom-management-commands",{"title":835,"path":836,"stem":837},"Working with Signals","/advanced-and-expert-topics/working-with-signals","22.advanced-and-expert-topics/09.working-with-signals",{"title":839,"path":840,"stem":841},"Building Reusable Django Packages","/advanced-and-expert-topics/building-reusable-django-packages","22.advanced-and-expert-topics/10.building-reusable-django-packages",{"title":843,"path":844,"stem":845},"Integrating Microservices","/advanced-and-expert-topics/integrating-microservices","22.advanced-and-expert-topics/11.integrating-microservices",{"title":847,"path":848,"stem":849},"Advanced Security Hardening","/advanced-and-expert-topics/advanced-security-hardening","22.advanced-and-expert-topics/12.advanced-security-hardening",{"title":851,"path":852,"stem":853,"children":854},"Logging in Django","/logging-in-django","23.logging-in-django/01.index",[855],{"title":851,"path":852,"stem":853},{"title":857,"path":858,"stem":859,"children":860},"FAQ and Troubleshooting","/faq-and-troubleshooting","24.faq-and-troubleshooting/01.index",[861],{"title":857,"path":858,"stem":859},{"title":863,"path":864,"stem":865,"children":866},"External Packages and Ecosystem","/external-packages-and-ecosystem","25.external-packages-and-ecosystem/01.index",[867],{"title":863,"path":864,"stem":865},{"title":869,"path":870,"stem":871,"children":872},"Django Internals and Contributing","/django-internals-and-contributing","26.django-internals-and-contributing/01.index",[873],{"title":869,"path":870,"stem":871},{"title":875,"path":876,"stem":877,"children":878},"Microservices with Django","/microservices-with-django","27.microservices-with-django/01.index",[879,880,884,888,892,896,900,904,908,912,916,920,924],{"title":875,"path":876,"stem":877},{"title":881,"path":882,"stem":883},"What Is a Microservice?","/microservices-with-django/what-is-a-microservice","27.microservices-with-django/02.what-is-a-microservice",{"title":885,"path":886,"stem":887},"Introducing the Django Microservices Architecture","/microservices-with-django/django-microservices-architecture","27.microservices-with-django/03.django-microservices-architecture",{"title":889,"path":890,"stem":891},"Setting Up the Development and Runtime Environment","/microservices-with-django/development-environment","27.microservices-with-django/04.development-environment",{"title":893,"path":894,"stem":895},"Cloud-native Data Processing with MongoDB","/microservices-with-django/cloud-native-data-processing","27.microservices-with-django/05.cloud-native-data-processing",{"title":897,"path":898,"stem":899},"Creating RESTful APIs for Microservices","/microservices-with-django/restful-apis","27.microservices-with-django/06.restful-apis",{"title":901,"path":902,"stem":903},"Orchestrating Microservices with Celery and RabbitMQ","/microservices-with-django/orchestrating-celery-rabbitmq","27.microservices-with-django/07.orchestrating-celery-rabbitmq",{"title":905,"path":906,"stem":907},"Testing Microservices","/microservices-with-django/testing-microservices","27.microservices-with-django/08.testing-microservices",{"title":909,"path":910,"stem":911},"Deploying Microservices","/microservices-with-django/deploying-microservices","27.microservices-with-django/09.deploying-microservices",{"title":913,"path":914,"stem":915},"Securing Microservices","/microservices-with-django/securing-microservices","27.microservices-with-django/10.securing-microservices",{"title":917,"path":918,"stem":919},"Improving Microservices Performance with Caching","/microservices-with-django/performance-caching","27.microservices-with-django/11.performance-caching",{"title":921,"path":922,"stem":923},"Best Practices","/microservices-with-django/best-practices","27.microservices-with-django/12.best-practices",{"title":925,"path":926,"stem":927},"Transforming a Monolithic Web App into a Microservice version","/microservices-with-django/monolith-to-microservices","27.microservices-with-django/13.monolith-to-microservices",{"title":929,"path":930,"stem":931,"children":932},"Releases","/releases","releases",[933,936,940,944,948,952,956,960,964,968,972,976,980,984,988,992,996,1000,1004,1008,1012],{"title":934,"path":930,"stem":935},"Django Releases","releases/index",{"title":937,"path":938,"stem":939},"Django 5.1.10 release notes","/releases/5.1.10","releases/5.1.10",{"title":941,"path":942,"stem":943},"Django 5.1.11 release notes","/releases/5.1.11","releases/5.1.11",{"title":945,"path":946,"stem":947},"Django 5.1.12 release notes","/releases/5.1.12","releases/5.1.12",{"title":949,"path":950,"stem":951},"Django 5.1.13 release notes","/releases/5.1.13","releases/5.1.13",{"title":953,"path":954,"stem":955},"Django 5.1.14 release notes","/releases/5.1.14","releases/5.1.14",{"title":957,"path":958,"stem":959},"Django 5.1.15 release notes","/releases/5.1.15","releases/5.1.15",{"title":961,"path":962,"stem":963},"Django 5.2 release notes","/releases/5.2","releases/5.2",{"title":965,"path":966,"stem":967},"Django 5.2.1 release notes","/releases/5.2.1","releases/5.2.1",{"title":969,"path":970,"stem":971},"Django 5.2.10 release notes","/releases/5.2.10","releases/5.2.10",{"title":973,"path":974,"stem":975},"Django 5.2.2 release notes","/releases/5.2.2","releases/5.2.2",{"title":977,"path":978,"stem":979},"Django 5.2.3 release notes","/releases/5.2.3","releases/5.2.3",{"title":981,"path":982,"stem":983},"Django 5.2.4 release notes","/releases/5.2.4","releases/5.2.4",{"title":985,"path":986,"stem":987},"Django 5.2.5 release notes","/releases/5.2.5","releases/5.2.5",{"title":989,"path":990,"stem":991},"Django 5.2.6 release notes","/releases/5.2.6","releases/5.2.6",{"title":993,"path":994,"stem":995},"Django 5.2.7 release notes","/releases/5.2.7","releases/5.2.7",{"title":997,"path":998,"stem":999},"Django 5.2.8 release notes","/releases/5.2.8","releases/5.2.8",{"title":1001,"path":1002,"stem":1003},"Django 5.2.9 release notes","/releases/5.2.9","releases/5.2.9",{"title":1005,"path":1006,"stem":1007},"Django 6.0 release notes","/releases/6.0","releases/6.0",{"title":1009,"path":1010,"stem":1011},"Django 6.0.1 release notes","/releases/6.0.1","releases/6.0.1",{"title":1013,"path":1014,"stem":1015},"Django 6.1 release notes - UNDER DEVELOPMENT","/releases/6.1","releases/6.1",{"id":1017,"title":781,"body":1018,"description":1028,"extension":9108,"links":9109,"meta":9110,"navigation":1158,"path":782,"seo":9111,"stem":783,"__hash__":9112},"docs/21.performance-and-optimization/02.query-optimization.md",{"type":1019,"value":1020,"toc":9066},"minimark",[1021,1025,1029,1034,1039,1042,1239,1243,1595,1599,1602,1606,2018,2022,2642,2646,2651,2655,2788,2792,2895,2899,3068,3072,3600,3604,3609,3613,3755,3759,3982,3986,4109,4113,4254,4258,4262,4265,4445,4449,4452,4770,4774,4777,5059,5063,5066,5225,5229,5233,5595,5599,6331,6335,6569,6573,6577,7118,7122,7515,7519,7523,7922,7926,8257,8261,9059,9062],[1022,1023,781],"h1",{"id":1024},"query-optimization",[1026,1027,1028],"p",{},"Database queries are often the primary performance bottleneck in Django applications. This chapter covers comprehensive query optimization techniques, from eliminating N+1 queries to implementing advanced database optimization strategies that can improve application performance by orders of magnitude.",[1030,1031,1033],"h2",{"id":1032},"understanding-django-orm-query-execution","Understanding Django ORM Query Execution",[1035,1036,1038],"h3",{"id":1037},"query-evaluation-and-lazy-loading","Query Evaluation and Lazy Loading",[1026,1040,1041],{},"Django QuerySets are lazy - they don't hit the database until you actually need the data:",[1043,1044,1049],"pre",{"className":1045,"code":1046,"language":1047,"meta":1048,"style":1048},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# No database query executed yet\narticles = Article.objects.all()\npublished_articles = articles.filter(is_published=True)\nrecent_articles = published_articles.order_by('-created_at')\n\n# Database query executed here\nfor article in recent_articles[:10]:\n    print(article.title)\n\n# Another query executed here\ncount = recent_articles.count()\n","python","",[1050,1051,1052,1061,1091,1123,1153,1160,1166,1192,1211,1216,1222],"code",{"__ignoreMap":1048},[1053,1054,1057],"span",{"class":1055,"line":1056},"line",1,[1053,1058,1060],{"class":1059},"s9Tkl","# No database query executed yet\n",[1053,1062,1064,1068,1072,1075,1078,1082,1084,1088],{"class":1055,"line":1063},2,[1053,1065,1067],{"class":1066},"sftqT","articles ",[1053,1069,1071],{"class":1070},"soVBu","=",[1053,1073,1074],{"class":1066}," Article",[1053,1076,1077],{"class":1070},".",[1053,1079,1081],{"class":1080},"sBPpx","objects",[1053,1083,1077],{"class":1070},[1053,1085,1087],{"class":1086},"siWMO","all",[1053,1089,1090],{"class":1070},"()\n",[1053,1092,1094,1097,1099,1102,1104,1107,1110,1114,1116,1120],{"class":1055,"line":1093},3,[1053,1095,1096],{"class":1066},"published_articles ",[1053,1098,1071],{"class":1070},[1053,1100,1101],{"class":1066}," articles",[1053,1103,1077],{"class":1070},[1053,1105,1106],{"class":1086},"filter",[1053,1108,1109],{"class":1070},"(",[1053,1111,1113],{"class":1112},"sqOPj","is_published",[1053,1115,1071],{"class":1070},[1053,1117,1119],{"class":1118},"s8XtY","True",[1053,1121,1122],{"class":1070},")\n",[1053,1124,1126,1129,1131,1134,1136,1139,1141,1145,1149,1151],{"class":1055,"line":1125},4,[1053,1127,1128],{"class":1066},"recent_articles ",[1053,1130,1071],{"class":1070},[1053,1132,1133],{"class":1066}," published_articles",[1053,1135,1077],{"class":1070},[1053,1137,1138],{"class":1086},"order_by",[1053,1140,1109],{"class":1070},[1053,1142,1144],{"class":1143},"sbYkP","'",[1053,1146,1148],{"class":1147},"sTbE_","-created_at",[1053,1150,1144],{"class":1143},[1053,1152,1122],{"class":1070},[1053,1154,1156],{"class":1055,"line":1155},5,[1053,1157,1159],{"emptyLinePlaceholder":1158},true,"\n",[1053,1161,1163],{"class":1055,"line":1162},6,[1053,1164,1165],{"class":1059},"# Database query executed here\n",[1053,1167,1169,1173,1176,1179,1182,1185,1189],{"class":1055,"line":1168},7,[1053,1170,1172],{"class":1171},"siDh9","for",[1053,1174,1175],{"class":1066}," article ",[1053,1177,1178],{"class":1171},"in",[1053,1180,1181],{"class":1066}," recent_articles",[1053,1183,1184],{"class":1070},"[:",[1053,1186,1188],{"class":1187},"s7CZa","10",[1053,1190,1191],{"class":1070},"]:\n",[1053,1193,1195,1199,1201,1204,1206,1209],{"class":1055,"line":1194},8,[1053,1196,1198],{"class":1197},"sJdAF","    print",[1053,1200,1109],{"class":1070},[1053,1202,1203],{"class":1086},"article",[1053,1205,1077],{"class":1070},[1053,1207,1208],{"class":1080},"title",[1053,1210,1122],{"class":1070},[1053,1212,1214],{"class":1055,"line":1213},9,[1053,1215,1159],{"emptyLinePlaceholder":1158},[1053,1217,1219],{"class":1055,"line":1218},10,[1053,1220,1221],{"class":1059},"# Another query executed here\n",[1053,1223,1225,1228,1230,1232,1234,1237],{"class":1055,"line":1224},11,[1053,1226,1227],{"class":1066},"count ",[1053,1229,1071],{"class":1070},[1053,1231,1181],{"class":1066},[1053,1233,1077],{"class":1070},[1053,1235,1236],{"class":1086},"count",[1053,1238,1090],{"class":1070},[1035,1240,1242],{"id":1241},"query-execution-analysis","Query Execution Analysis",[1043,1244,1246],{"className":1045,"code":1245,"language":1047,"meta":1048,"style":1048},"from django.db import connection\nfrom django.test.utils import override_settings\n\n@override_settings(DEBUG=True)\ndef analyze_queries():\n    # Reset query log\n    connection.queries_log.clear()\n    \n    # Execute your code\n    articles = Article.objects.select_related('author').all()[:10]\n    for article in articles:\n        print(f\"{article.title} by {article.author.name}\")\n    \n    # Analyze queries\n    print(f\"Number of queries: {len(connection.queries)}\")\n    for query in connection.queries:\n        print(f\"Query: {query['sql']}\")\n        print(f\"Time: {query['time']}s\")\n",[1050,1247,1248,1267,1288,1292,1312,1324,1329,1346,1351,1356,1396,1410,1459,1464,1470,1506,1525,1561],{"__ignoreMap":1048},[1053,1249,1250,1253,1256,1258,1261,1264],{"class":1055,"line":1056},[1053,1251,1252],{"class":1171},"from",[1053,1254,1255],{"class":1066}," django",[1053,1257,1077],{"class":1070},[1053,1259,1260],{"class":1066},"db ",[1053,1262,1263],{"class":1171},"import",[1053,1265,1266],{"class":1066}," connection\n",[1053,1268,1269,1271,1273,1275,1278,1280,1283,1285],{"class":1055,"line":1063},[1053,1270,1252],{"class":1171},[1053,1272,1255],{"class":1066},[1053,1274,1077],{"class":1070},[1053,1276,1277],{"class":1066},"test",[1053,1279,1077],{"class":1070},[1053,1281,1282],{"class":1066},"utils ",[1053,1284,1263],{"class":1171},[1053,1286,1287],{"class":1066}," override_settings\n",[1053,1289,1290],{"class":1055,"line":1093},[1053,1291,1159],{"emptyLinePlaceholder":1158},[1053,1293,1294,1297,1301,1303,1306,1308,1310],{"class":1055,"line":1125},[1053,1295,1296],{"class":1070},"@",[1053,1298,1300],{"class":1299},"sljsM","override_settings",[1053,1302,1109],{"class":1070},[1053,1304,1305],{"class":1112},"DEBUG",[1053,1307,1071],{"class":1070},[1053,1309,1119],{"class":1118},[1053,1311,1122],{"class":1070},[1053,1313,1314,1318,1321],{"class":1055,"line":1155},[1053,1315,1317],{"class":1316},"s5Kfy","def",[1053,1319,1320],{"class":1299}," analyze_queries",[1053,1322,1323],{"class":1070},"():\n",[1053,1325,1326],{"class":1055,"line":1162},[1053,1327,1328],{"class":1059},"    # Reset query log\n",[1053,1330,1331,1334,1336,1339,1341,1344],{"class":1055,"line":1168},[1053,1332,1333],{"class":1066},"    connection",[1053,1335,1077],{"class":1070},[1053,1337,1338],{"class":1080},"queries_log",[1053,1340,1077],{"class":1070},[1053,1342,1343],{"class":1086},"clear",[1053,1345,1090],{"class":1070},[1053,1347,1348],{"class":1055,"line":1194},[1053,1349,1350],{"class":1066},"    \n",[1053,1352,1353],{"class":1055,"line":1213},[1053,1354,1355],{"class":1059},"    # Execute your code\n",[1053,1357,1358,1361,1363,1365,1367,1369,1371,1374,1376,1378,1381,1383,1386,1388,1391,1393],{"class":1055,"line":1218},[1053,1359,1360],{"class":1066},"    articles ",[1053,1362,1071],{"class":1070},[1053,1364,1074],{"class":1066},[1053,1366,1077],{"class":1070},[1053,1368,1081],{"class":1080},[1053,1370,1077],{"class":1070},[1053,1372,1373],{"class":1086},"select_related",[1053,1375,1109],{"class":1070},[1053,1377,1144],{"class":1143},[1053,1379,1380],{"class":1147},"author",[1053,1382,1144],{"class":1143},[1053,1384,1385],{"class":1070},").",[1053,1387,1087],{"class":1086},[1053,1389,1390],{"class":1070},"()[:",[1053,1392,1188],{"class":1187},[1053,1394,1395],{"class":1070},"]\n",[1053,1397,1398,1401,1403,1405,1407],{"class":1055,"line":1224},[1053,1399,1400],{"class":1171},"    for",[1053,1402,1175],{"class":1066},[1053,1404,1178],{"class":1171},[1053,1406,1101],{"class":1066},[1053,1408,1409],{"class":1070},":\n",[1053,1411,1413,1416,1418,1421,1424,1428,1430,1432,1434,1437,1440,1442,1444,1446,1448,1450,1453,1455,1457],{"class":1055,"line":1412},12,[1053,1414,1415],{"class":1197},"        print",[1053,1417,1109],{"class":1070},[1053,1419,1420],{"class":1316},"f",[1053,1422,1423],{"class":1147},"\"",[1053,1425,1427],{"class":1426},"s3h35","{",[1053,1429,1203],{"class":1086},[1053,1431,1077],{"class":1070},[1053,1433,1208],{"class":1080},[1053,1435,1436],{"class":1426},"}",[1053,1438,1439],{"class":1147}," by ",[1053,1441,1427],{"class":1426},[1053,1443,1203],{"class":1086},[1053,1445,1077],{"class":1070},[1053,1447,1380],{"class":1080},[1053,1449,1077],{"class":1070},[1053,1451,1452],{"class":1080},"name",[1053,1454,1436],{"class":1426},[1053,1456,1423],{"class":1147},[1053,1458,1122],{"class":1070},[1053,1460,1462],{"class":1055,"line":1461},13,[1053,1463,1350],{"class":1066},[1053,1465,1467],{"class":1055,"line":1466},14,[1053,1468,1469],{"class":1059},"    # Analyze queries\n",[1053,1471,1473,1475,1477,1479,1482,1484,1487,1489,1492,1494,1497,1500,1502,1504],{"class":1055,"line":1472},15,[1053,1474,1198],{"class":1197},[1053,1476,1109],{"class":1070},[1053,1478,1420],{"class":1316},[1053,1480,1481],{"class":1147},"\"Number of queries: ",[1053,1483,1427],{"class":1426},[1053,1485,1486],{"class":1197},"len",[1053,1488,1109],{"class":1070},[1053,1490,1491],{"class":1086},"connection",[1053,1493,1077],{"class":1070},[1053,1495,1496],{"class":1080},"queries",[1053,1498,1499],{"class":1070},")",[1053,1501,1436],{"class":1426},[1053,1503,1423],{"class":1147},[1053,1505,1122],{"class":1070},[1053,1507,1509,1511,1514,1516,1519,1521,1523],{"class":1055,"line":1508},16,[1053,1510,1400],{"class":1171},[1053,1512,1513],{"class":1066}," query ",[1053,1515,1178],{"class":1171},[1053,1517,1518],{"class":1066}," connection",[1053,1520,1077],{"class":1070},[1053,1522,1496],{"class":1080},[1053,1524,1409],{"class":1070},[1053,1526,1528,1530,1532,1534,1537,1539,1542,1545,1547,1550,1552,1555,1557,1559],{"class":1055,"line":1527},17,[1053,1529,1415],{"class":1197},[1053,1531,1109],{"class":1070},[1053,1533,1420],{"class":1316},[1053,1535,1536],{"class":1147},"\"Query: ",[1053,1538,1427],{"class":1426},[1053,1540,1541],{"class":1086},"query",[1053,1543,1544],{"class":1070},"[",[1053,1546,1144],{"class":1143},[1053,1548,1549],{"class":1147},"sql",[1053,1551,1144],{"class":1143},[1053,1553,1554],{"class":1070},"]",[1053,1556,1436],{"class":1426},[1053,1558,1423],{"class":1147},[1053,1560,1122],{"class":1070},[1053,1562,1564,1566,1568,1570,1573,1575,1577,1579,1581,1584,1586,1588,1590,1593],{"class":1055,"line":1563},18,[1053,1565,1415],{"class":1197},[1053,1567,1109],{"class":1070},[1053,1569,1420],{"class":1316},[1053,1571,1572],{"class":1147},"\"Time: ",[1053,1574,1427],{"class":1426},[1053,1576,1541],{"class":1086},[1053,1578,1544],{"class":1070},[1053,1580,1144],{"class":1143},[1053,1582,1583],{"class":1147},"time",[1053,1585,1144],{"class":1143},[1053,1587,1554],{"class":1070},[1053,1589,1436],{"class":1426},[1053,1591,1592],{"class":1147},"s\"",[1053,1594,1122],{"class":1070},[1030,1596,1598],{"id":1597},"the-n1-query-problem","The N+1 Query Problem",[1026,1600,1601],{},"The N+1 query problem is the most common performance issue in Django applications:",[1035,1603,1605],{"id":1604},"identifying-n1-queries","Identifying N+1 Queries",[1043,1607,1609],{"className":1045,"code":1608,"language":1047,"meta":1048,"style":1048},"# BAD: N+1 Query Problem\ndef article_list_bad(request):\n    articles = Article.objects.all()[:10]  # 1 query\n    \n    for article in articles:\n        # Each of these creates a new query!\n        print(article.author.name)      # Query 2, 3, 4...\n        print(article.category.name)    # Query 12, 13, 14...\n        print(article.tags.count())     # Query 22, 23, 24...\n    \n    # Total: 1 + 10 + 10 + 10 = 31 queries!\n    return render(request, 'articles/list.html', {'articles': articles})\n\n# GOOD: Optimized Version\ndef article_list_good(request):\n    articles = Article.objects.select_related(\n        'author',\n        'category'\n    ).prefetch_related(\n        'tags'\n    ).all()[:10]  # Only 3 queries total!\n    \n    for article in articles:\n        print(article.author.name)      # No additional query\n        print(article.category.name)    # No additional query\n        print(article.tags.count())     # No additional query\n    \n    return render(request, 'articles/list.html', {'articles': articles})\n",[1050,1610,1611,1616,1632,1657,1661,1673,1678,1699,1721,1744,1748,1753,1796,1800,1805,1818,1837,1849,1858,1869,1878,1894,1899,1912,1934,1956,1978,1983],{"__ignoreMap":1048},[1053,1612,1613],{"class":1055,"line":1056},[1053,1614,1615],{"class":1059},"# BAD: N+1 Query Problem\n",[1053,1617,1618,1620,1623,1625,1629],{"class":1055,"line":1063},[1053,1619,1317],{"class":1316},[1053,1621,1622],{"class":1299}," article_list_bad",[1053,1624,1109],{"class":1070},[1053,1626,1628],{"class":1627},"sCyAa","request",[1053,1630,1631],{"class":1070},"):\n",[1053,1633,1634,1636,1638,1640,1642,1644,1646,1648,1650,1652,1654],{"class":1055,"line":1093},[1053,1635,1360],{"class":1066},[1053,1637,1071],{"class":1070},[1053,1639,1074],{"class":1066},[1053,1641,1077],{"class":1070},[1053,1643,1081],{"class":1080},[1053,1645,1077],{"class":1070},[1053,1647,1087],{"class":1086},[1053,1649,1390],{"class":1070},[1053,1651,1188],{"class":1187},[1053,1653,1554],{"class":1070},[1053,1655,1656],{"class":1059},"  # 1 query\n",[1053,1658,1659],{"class":1055,"line":1125},[1053,1660,1350],{"class":1066},[1053,1662,1663,1665,1667,1669,1671],{"class":1055,"line":1155},[1053,1664,1400],{"class":1171},[1053,1666,1175],{"class":1066},[1053,1668,1178],{"class":1171},[1053,1670,1101],{"class":1066},[1053,1672,1409],{"class":1070},[1053,1674,1675],{"class":1055,"line":1162},[1053,1676,1677],{"class":1059},"        # Each of these creates a new query!\n",[1053,1679,1680,1682,1684,1686,1688,1690,1692,1694,1696],{"class":1055,"line":1168},[1053,1681,1415],{"class":1197},[1053,1683,1109],{"class":1070},[1053,1685,1203],{"class":1086},[1053,1687,1077],{"class":1070},[1053,1689,1380],{"class":1080},[1053,1691,1077],{"class":1070},[1053,1693,1452],{"class":1080},[1053,1695,1499],{"class":1070},[1053,1697,1698],{"class":1059},"      # Query 2, 3, 4...\n",[1053,1700,1701,1703,1705,1707,1709,1712,1714,1716,1718],{"class":1055,"line":1194},[1053,1702,1415],{"class":1197},[1053,1704,1109],{"class":1070},[1053,1706,1203],{"class":1086},[1053,1708,1077],{"class":1070},[1053,1710,1711],{"class":1080},"category",[1053,1713,1077],{"class":1070},[1053,1715,1452],{"class":1080},[1053,1717,1499],{"class":1070},[1053,1719,1720],{"class":1059},"    # Query 12, 13, 14...\n",[1053,1722,1723,1725,1727,1729,1731,1734,1736,1738,1741],{"class":1055,"line":1213},[1053,1724,1415],{"class":1197},[1053,1726,1109],{"class":1070},[1053,1728,1203],{"class":1086},[1053,1730,1077],{"class":1070},[1053,1732,1733],{"class":1080},"tags",[1053,1735,1077],{"class":1070},[1053,1737,1236],{"class":1086},[1053,1739,1740],{"class":1070},"())",[1053,1742,1743],{"class":1059},"     # Query 22, 23, 24...\n",[1053,1745,1746],{"class":1055,"line":1218},[1053,1747,1350],{"class":1066},[1053,1749,1750],{"class":1055,"line":1224},[1053,1751,1752],{"class":1059},"    # Total: 1 + 10 + 10 + 10 = 31 queries!\n",[1053,1754,1755,1758,1761,1763,1765,1768,1771,1774,1776,1778,1781,1783,1786,1788,1791,1793],{"class":1055,"line":1412},[1053,1756,1757],{"class":1171},"    return",[1053,1759,1760],{"class":1086}," render",[1053,1762,1109],{"class":1070},[1053,1764,1628],{"class":1086},[1053,1766,1767],{"class":1070},",",[1053,1769,1770],{"class":1143}," '",[1053,1772,1773],{"class":1147},"articles/list.html",[1053,1775,1144],{"class":1143},[1053,1777,1767],{"class":1070},[1053,1779,1780],{"class":1070}," {",[1053,1782,1144],{"class":1143},[1053,1784,1785],{"class":1147},"articles",[1053,1787,1144],{"class":1143},[1053,1789,1790],{"class":1070},":",[1053,1792,1101],{"class":1086},[1053,1794,1795],{"class":1070},"})\n",[1053,1797,1798],{"class":1055,"line":1461},[1053,1799,1159],{"emptyLinePlaceholder":1158},[1053,1801,1802],{"class":1055,"line":1466},[1053,1803,1804],{"class":1059},"# GOOD: Optimized Version\n",[1053,1806,1807,1809,1812,1814,1816],{"class":1055,"line":1472},[1053,1808,1317],{"class":1316},[1053,1810,1811],{"class":1299}," article_list_good",[1053,1813,1109],{"class":1070},[1053,1815,1628],{"class":1627},[1053,1817,1631],{"class":1070},[1053,1819,1820,1822,1824,1826,1828,1830,1832,1834],{"class":1055,"line":1508},[1053,1821,1360],{"class":1066},[1053,1823,1071],{"class":1070},[1053,1825,1074],{"class":1066},[1053,1827,1077],{"class":1070},[1053,1829,1081],{"class":1080},[1053,1831,1077],{"class":1070},[1053,1833,1373],{"class":1086},[1053,1835,1836],{"class":1070},"(\n",[1053,1838,1839,1842,1844,1846],{"class":1055,"line":1527},[1053,1840,1841],{"class":1143},"        '",[1053,1843,1380],{"class":1147},[1053,1845,1144],{"class":1143},[1053,1847,1848],{"class":1070},",\n",[1053,1850,1851,1853,1855],{"class":1055,"line":1563},[1053,1852,1841],{"class":1143},[1053,1854,1711],{"class":1147},[1053,1856,1857],{"class":1143},"'\n",[1053,1859,1861,1864,1867],{"class":1055,"line":1860},19,[1053,1862,1863],{"class":1070},"    ).",[1053,1865,1866],{"class":1086},"prefetch_related",[1053,1868,1836],{"class":1070},[1053,1870,1872,1874,1876],{"class":1055,"line":1871},20,[1053,1873,1841],{"class":1143},[1053,1875,1733],{"class":1147},[1053,1877,1857],{"class":1143},[1053,1879,1881,1883,1885,1887,1889,1891],{"class":1055,"line":1880},21,[1053,1882,1863],{"class":1070},[1053,1884,1087],{"class":1086},[1053,1886,1390],{"class":1070},[1053,1888,1188],{"class":1187},[1053,1890,1554],{"class":1070},[1053,1892,1893],{"class":1059},"  # Only 3 queries total!\n",[1053,1895,1897],{"class":1055,"line":1896},22,[1053,1898,1350],{"class":1066},[1053,1900,1902,1904,1906,1908,1910],{"class":1055,"line":1901},23,[1053,1903,1400],{"class":1171},[1053,1905,1175],{"class":1066},[1053,1907,1178],{"class":1171},[1053,1909,1101],{"class":1066},[1053,1911,1409],{"class":1070},[1053,1913,1915,1917,1919,1921,1923,1925,1927,1929,1931],{"class":1055,"line":1914},24,[1053,1916,1415],{"class":1197},[1053,1918,1109],{"class":1070},[1053,1920,1203],{"class":1086},[1053,1922,1077],{"class":1070},[1053,1924,1380],{"class":1080},[1053,1926,1077],{"class":1070},[1053,1928,1452],{"class":1080},[1053,1930,1499],{"class":1070},[1053,1932,1933],{"class":1059},"      # No additional query\n",[1053,1935,1937,1939,1941,1943,1945,1947,1949,1951,1953],{"class":1055,"line":1936},25,[1053,1938,1415],{"class":1197},[1053,1940,1109],{"class":1070},[1053,1942,1203],{"class":1086},[1053,1944,1077],{"class":1070},[1053,1946,1711],{"class":1080},[1053,1948,1077],{"class":1070},[1053,1950,1452],{"class":1080},[1053,1952,1499],{"class":1070},[1053,1954,1955],{"class":1059},"    # No additional query\n",[1053,1957,1959,1961,1963,1965,1967,1969,1971,1973,1975],{"class":1055,"line":1958},26,[1053,1960,1415],{"class":1197},[1053,1962,1109],{"class":1070},[1053,1964,1203],{"class":1086},[1053,1966,1077],{"class":1070},[1053,1968,1733],{"class":1080},[1053,1970,1077],{"class":1070},[1053,1972,1236],{"class":1086},[1053,1974,1740],{"class":1070},[1053,1976,1977],{"class":1059},"     # No additional query\n",[1053,1979,1981],{"class":1055,"line":1980},27,[1053,1982,1350],{"class":1066},[1053,1984,1986,1988,1990,1992,1994,1996,1998,2000,2002,2004,2006,2008,2010,2012,2014,2016],{"class":1055,"line":1985},28,[1053,1987,1757],{"class":1171},[1053,1989,1760],{"class":1086},[1053,1991,1109],{"class":1070},[1053,1993,1628],{"class":1086},[1053,1995,1767],{"class":1070},[1053,1997,1770],{"class":1143},[1053,1999,1773],{"class":1147},[1053,2001,1144],{"class":1143},[1053,2003,1767],{"class":1070},[1053,2005,1780],{"class":1070},[1053,2007,1144],{"class":1143},[1053,2009,1785],{"class":1147},[1053,2011,1144],{"class":1143},[1053,2013,1790],{"class":1070},[1053,2015,1101],{"class":1086},[1053,2017,1795],{"class":1070},[1035,2019,2021],{"id":2020},"advanced-n1-detection","Advanced N+1 Detection",[1043,2023,2025],{"className":1045,"code":2024,"language":1047,"meta":1048,"style":1048},"# Custom middleware to detect N+1 queries\nimport logging\nfrom django.db import connection\nfrom django.utils.deprecation import MiddlewareMixin\n\nlogger = logging.getLogger(__name__)\n\nclass N1QueryDetectionMiddleware(MiddlewareMixin):\n    def process_request(self, request):\n        request.initial_queries = len(connection.queries)\n    \n    def process_response(self, request, response):\n        if hasattr(request, 'initial_queries'):\n            num_queries = len(connection.queries) - request.initial_queries\n            \n            # Detect potential N+1 queries\n            if num_queries > 10:\n                similar_queries = self.find_similar_queries(\n                    connection.queries[request.initial_queries:]\n                )\n                \n                if similar_queries:\n                    logger.warning(\n                        f\"Potential N+1 query detected on {request.path}: \"\n                        f\"{num_queries} queries, {len(similar_queries)} similar patterns\"\n                    )\n        \n        return response\n    \n    def find_similar_queries(self, queries):\n        \"\"\"Find queries with similar patterns (potential N+1)\"\"\"\n        patterns = {}\n        for query in queries:\n            # Normalize query by replacing numbers with placeholders\n            normalized = re.sub(r'\\d+', 'X', query['sql'])\n            patterns[normalized] = patterns.get(normalized, 0) + 1\n        \n        # Return patterns that appear more than once\n        return {k: v for k, v in patterns.items() if v > 1}\n",[1050,2026,2027,2032,2039,2053,2074,2078,2101,2105,2122,2143,2169,2173,2195,2217,2247,2252,2257,2273,2291,2311,2316,2321,2331,2343,2365,2397,2402,2407,2415,2420,2439,2453,2464,2478,2484,2542,2582,2587,2593],{"__ignoreMap":1048},[1053,2028,2029],{"class":1055,"line":1056},[1053,2030,2031],{"class":1059},"# Custom middleware to detect N+1 queries\n",[1053,2033,2034,2036],{"class":1055,"line":1063},[1053,2035,1263],{"class":1171},[1053,2037,2038],{"class":1066}," logging\n",[1053,2040,2041,2043,2045,2047,2049,2051],{"class":1055,"line":1093},[1053,2042,1252],{"class":1171},[1053,2044,1255],{"class":1066},[1053,2046,1077],{"class":1070},[1053,2048,1260],{"class":1066},[1053,2050,1263],{"class":1171},[1053,2052,1266],{"class":1066},[1053,2054,2055,2057,2059,2061,2064,2066,2069,2071],{"class":1055,"line":1125},[1053,2056,1252],{"class":1171},[1053,2058,1255],{"class":1066},[1053,2060,1077],{"class":1070},[1053,2062,2063],{"class":1066},"utils",[1053,2065,1077],{"class":1070},[1053,2067,2068],{"class":1066},"deprecation ",[1053,2070,1263],{"class":1171},[1053,2072,2073],{"class":1066}," MiddlewareMixin\n",[1053,2075,2076],{"class":1055,"line":1155},[1053,2077,1159],{"emptyLinePlaceholder":1158},[1053,2079,2080,2083,2085,2088,2090,2093,2095,2099],{"class":1055,"line":1162},[1053,2081,2082],{"class":1066},"logger ",[1053,2084,1071],{"class":1070},[1053,2086,2087],{"class":1066}," logging",[1053,2089,1077],{"class":1070},[1053,2091,2092],{"class":1086},"getLogger",[1053,2094,1109],{"class":1070},[1053,2096,2098],{"class":2097},"s131V","__name__",[1053,2100,1122],{"class":1070},[1053,2102,2103],{"class":1055,"line":1168},[1053,2104,1159],{"emptyLinePlaceholder":1158},[1053,2106,2107,2110,2114,2116,2120],{"class":1055,"line":1194},[1053,2108,2109],{"class":1316},"class",[1053,2111,2113],{"class":2112},"sD-vU"," N1QueryDetectionMiddleware",[1053,2115,1109],{"class":1070},[1053,2117,2119],{"class":2118},"sYn-s","MiddlewareMixin",[1053,2121,1631],{"class":1070},[1053,2123,2124,2127,2130,2132,2136,2138,2141],{"class":1055,"line":1213},[1053,2125,2126],{"class":1316},"    def",[1053,2128,2129],{"class":1299}," process_request",[1053,2131,1109],{"class":1070},[1053,2133,2135],{"class":2134},"sRjD_","self",[1053,2137,1767],{"class":1070},[1053,2139,2140],{"class":1627}," request",[1053,2142,1631],{"class":1070},[1053,2144,2145,2148,2150,2153,2156,2159,2161,2163,2165,2167],{"class":1055,"line":1218},[1053,2146,2147],{"class":1066},"        request",[1053,2149,1077],{"class":1070},[1053,2151,2152],{"class":1080},"initial_queries",[1053,2154,2155],{"class":1070}," =",[1053,2157,2158],{"class":1197}," len",[1053,2160,1109],{"class":1070},[1053,2162,1491],{"class":1086},[1053,2164,1077],{"class":1070},[1053,2166,1496],{"class":1080},[1053,2168,1122],{"class":1070},[1053,2170,2171],{"class":1055,"line":1224},[1053,2172,1350],{"class":1066},[1053,2174,2175,2177,2180,2182,2184,2186,2188,2190,2193],{"class":1055,"line":1412},[1053,2176,2126],{"class":1316},[1053,2178,2179],{"class":1299}," process_response",[1053,2181,1109],{"class":1070},[1053,2183,2135],{"class":2134},[1053,2185,1767],{"class":1070},[1053,2187,2140],{"class":1627},[1053,2189,1767],{"class":1070},[1053,2191,2192],{"class":1627}," response",[1053,2194,1631],{"class":1070},[1053,2196,2197,2200,2203,2205,2207,2209,2211,2213,2215],{"class":1055,"line":1461},[1053,2198,2199],{"class":1171},"        if",[1053,2201,2202],{"class":1197}," hasattr",[1053,2204,1109],{"class":1070},[1053,2206,1628],{"class":1086},[1053,2208,1767],{"class":1070},[1053,2210,1770],{"class":1143},[1053,2212,2152],{"class":1147},[1053,2214,1144],{"class":1143},[1053,2216,1631],{"class":1070},[1053,2218,2219,2222,2224,2226,2228,2230,2232,2234,2236,2240,2242,2244],{"class":1055,"line":1466},[1053,2220,2221],{"class":1066},"            num_queries ",[1053,2223,1071],{"class":1070},[1053,2225,2158],{"class":1197},[1053,2227,1109],{"class":1070},[1053,2229,1491],{"class":1086},[1053,2231,1077],{"class":1070},[1053,2233,1496],{"class":1080},[1053,2235,1499],{"class":1070},[1053,2237,2239],{"class":2238},"sVsLi"," -",[1053,2241,2140],{"class":1066},[1053,2243,1077],{"class":1070},[1053,2245,2246],{"class":1080},"initial_queries\n",[1053,2248,2249],{"class":1055,"line":1472},[1053,2250,2251],{"class":1066},"            \n",[1053,2253,2254],{"class":1055,"line":1508},[1053,2255,2256],{"class":1059},"            # Detect potential N+1 queries\n",[1053,2258,2259,2262,2265,2268,2271],{"class":1055,"line":1527},[1053,2260,2261],{"class":1171},"            if",[1053,2263,2264],{"class":1066}," num_queries ",[1053,2266,2267],{"class":2238},">",[1053,2269,2270],{"class":1187}," 10",[1053,2272,1409],{"class":1070},[1053,2274,2275,2278,2280,2284,2286,2289],{"class":1055,"line":1563},[1053,2276,2277],{"class":1066},"                similar_queries ",[1053,2279,1071],{"class":1070},[1053,2281,2283],{"class":2282},"se3Ec"," self",[1053,2285,1077],{"class":1070},[1053,2287,2288],{"class":1086},"find_similar_queries",[1053,2290,1836],{"class":1070},[1053,2292,2293,2296,2298,2300,2302,2304,2306,2308],{"class":1055,"line":1860},[1053,2294,2295],{"class":1086},"                    connection",[1053,2297,1077],{"class":1070},[1053,2299,1496],{"class":1080},[1053,2301,1544],{"class":1070},[1053,2303,1628],{"class":1080},[1053,2305,1077],{"class":1070},[1053,2307,2152],{"class":1080},[1053,2309,2310],{"class":1070},":]\n",[1053,2312,2313],{"class":1055,"line":1871},[1053,2314,2315],{"class":1070},"                )\n",[1053,2317,2318],{"class":1055,"line":1880},[1053,2319,2320],{"class":1066},"                \n",[1053,2322,2323,2326,2329],{"class":1055,"line":1896},[1053,2324,2325],{"class":1171},"                if",[1053,2327,2328],{"class":1066}," similar_queries",[1053,2330,1409],{"class":1070},[1053,2332,2333,2336,2338,2341],{"class":1055,"line":1901},[1053,2334,2335],{"class":1066},"                    logger",[1053,2337,1077],{"class":1070},[1053,2339,2340],{"class":1086},"warning",[1053,2342,1836],{"class":1070},[1053,2344,2345,2348,2351,2353,2355,2357,2360,2362],{"class":1055,"line":1914},[1053,2346,2347],{"class":1316},"                        f",[1053,2349,2350],{"class":1147},"\"Potential N+1 query detected on ",[1053,2352,1427],{"class":1426},[1053,2354,1628],{"class":1086},[1053,2356,1077],{"class":1070},[1053,2358,2359],{"class":1080},"path",[1053,2361,1436],{"class":1426},[1053,2363,2364],{"class":1147},": \"\n",[1053,2366,2367,2369,2371,2373,2376,2378,2381,2383,2385,2387,2390,2392,2394],{"class":1055,"line":1936},[1053,2368,2347],{"class":1316},[1053,2370,1423],{"class":1147},[1053,2372,1427],{"class":1426},[1053,2374,2375],{"class":1086},"num_queries",[1053,2377,1436],{"class":1426},[1053,2379,2380],{"class":1147}," queries, ",[1053,2382,1427],{"class":1426},[1053,2384,1486],{"class":1197},[1053,2386,1109],{"class":1070},[1053,2388,2389],{"class":1086},"similar_queries",[1053,2391,1499],{"class":1070},[1053,2393,1436],{"class":1426},[1053,2395,2396],{"class":1147}," similar patterns\"\n",[1053,2398,2399],{"class":1055,"line":1958},[1053,2400,2401],{"class":1070},"                    )\n",[1053,2403,2404],{"class":1055,"line":1980},[1053,2405,2406],{"class":1066},"        \n",[1053,2408,2409,2412],{"class":1055,"line":1985},[1053,2410,2411],{"class":1171},"        return",[1053,2413,2414],{"class":1066}," response\n",[1053,2416,2418],{"class":1055,"line":2417},29,[1053,2419,1350],{"class":1066},[1053,2421,2423,2425,2428,2430,2432,2434,2437],{"class":1055,"line":2422},30,[1053,2424,2126],{"class":1316},[1053,2426,2427],{"class":1299}," find_similar_queries",[1053,2429,1109],{"class":1070},[1053,2431,2135],{"class":2134},[1053,2433,1767],{"class":1070},[1053,2435,2436],{"class":1627}," queries",[1053,2438,1631],{"class":1070},[1053,2440,2442,2446,2450],{"class":1055,"line":2441},31,[1053,2443,2445],{"class":2444},"sm7ve","        \"\"\"",[1053,2447,2449],{"class":2448},"sVyVU","Find queries with similar patterns (potential N+1)",[1053,2451,2452],{"class":2444},"\"\"\"\n",[1053,2454,2456,2459,2461],{"class":1055,"line":2455},32,[1053,2457,2458],{"class":1066},"        patterns ",[1053,2460,1071],{"class":1070},[1053,2462,2463],{"class":1070}," {}\n",[1053,2465,2467,2470,2472,2474,2476],{"class":1055,"line":2466},33,[1053,2468,2469],{"class":1171},"        for",[1053,2471,1513],{"class":1066},[1053,2473,1178],{"class":1171},[1053,2475,2436],{"class":1066},[1053,2477,1409],{"class":1070},[1053,2479,2481],{"class":1055,"line":2480},34,[1053,2482,2483],{"class":1059},"            # Normalize query by replacing numbers with placeholders\n",[1053,2485,2487,2490,2492,2495,2497,2500,2502,2505,2507,2511,2515,2517,2519,2521,2524,2526,2528,2531,2533,2535,2537,2539],{"class":1055,"line":2486},35,[1053,2488,2489],{"class":1066},"            normalized ",[1053,2491,1071],{"class":1070},[1053,2493,2494],{"class":1066}," re",[1053,2496,1077],{"class":1070},[1053,2498,2499],{"class":1086},"sub",[1053,2501,1109],{"class":1070},[1053,2503,2504],{"class":1316},"r",[1053,2506,1144],{"class":1143},[1053,2508,2510],{"class":2509},"sRJPX","\\d",[1053,2512,2514],{"class":2513},"sGuSu","+",[1053,2516,1144],{"class":1143},[1053,2518,1767],{"class":1070},[1053,2520,1770],{"class":1143},[1053,2522,2523],{"class":1147},"X",[1053,2525,1144],{"class":1143},[1053,2527,1767],{"class":1070},[1053,2529,2530],{"class":1086}," query",[1053,2532,1544],{"class":1070},[1053,2534,1144],{"class":1143},[1053,2536,1549],{"class":1147},[1053,2538,1144],{"class":1143},[1053,2540,2541],{"class":1070},"])\n",[1053,2543,2545,2548,2550,2553,2555,2557,2560,2562,2565,2567,2569,2571,2574,2576,2579],{"class":1055,"line":2544},36,[1053,2546,2547],{"class":1066},"            patterns",[1053,2549,1544],{"class":1070},[1053,2551,2552],{"class":1066},"normalized",[1053,2554,1554],{"class":1070},[1053,2556,2155],{"class":1070},[1053,2558,2559],{"class":1066}," patterns",[1053,2561,1077],{"class":1070},[1053,2563,2564],{"class":1086},"get",[1053,2566,1109],{"class":1070},[1053,2568,2552],{"class":1086},[1053,2570,1767],{"class":1070},[1053,2572,2573],{"class":1187}," 0",[1053,2575,1499],{"class":1070},[1053,2577,2578],{"class":2238}," +",[1053,2580,2581],{"class":1187}," 1\n",[1053,2583,2585],{"class":1055,"line":2584},37,[1053,2586,2406],{"class":1066},[1053,2588,2590],{"class":1055,"line":2589},38,[1053,2591,2592],{"class":1059},"        # Return patterns that appear more than once\n",[1053,2594,2596,2598,2600,2603,2605,2608,2610,2613,2615,2617,2619,2621,2623,2626,2629,2632,2634,2636,2639],{"class":1055,"line":2595},39,[1053,2597,2411],{"class":1171},[1053,2599,1780],{"class":1070},[1053,2601,2602],{"class":1066},"k",[1053,2604,1790],{"class":1070},[1053,2606,2607],{"class":1066}," v ",[1053,2609,1172],{"class":1171},[1053,2611,2612],{"class":1066}," k",[1053,2614,1767],{"class":1070},[1053,2616,2607],{"class":1066},[1053,2618,1178],{"class":1171},[1053,2620,2559],{"class":1066},[1053,2622,1077],{"class":1070},[1053,2624,2625],{"class":1086},"items",[1053,2627,2628],{"class":1070},"()",[1053,2630,2631],{"class":1171}," if",[1053,2633,2607],{"class":1066},[1053,2635,2267],{"class":2238},[1053,2637,2638],{"class":1187}," 1",[1053,2640,2641],{"class":1070},"}\n",[1030,2643,2645],{"id":2644},"select-related-optimization","Select Related Optimization",[1026,2647,2648,2650],{},[1050,2649,1373],{}," performs SQL JOINs to fetch related objects in a single query:",[1035,2652,2654],{"id":2653},"basic-select-related","Basic Select Related",[1043,2656,2658],{"className":1045,"code":2657,"language":1047,"meta":1048,"style":1048},"# Without select_related: 1 + N queries\narticles = Article.objects.all()\nfor article in articles:\n    print(article.author.name)  # New query for each article\n\n# With select_related: 1 query\narticles = Article.objects.select_related('author').all()\nfor article in articles:\n    print(article.author.name)  # No additional query\n",[1050,2659,2660,2665,2683,2695,2716,2720,2725,2755,2767],{"__ignoreMap":1048},[1053,2661,2662],{"class":1055,"line":1056},[1053,2663,2664],{"class":1059},"# Without select_related: 1 + N queries\n",[1053,2666,2667,2669,2671,2673,2675,2677,2679,2681],{"class":1055,"line":1063},[1053,2668,1067],{"class":1066},[1053,2670,1071],{"class":1070},[1053,2672,1074],{"class":1066},[1053,2674,1077],{"class":1070},[1053,2676,1081],{"class":1080},[1053,2678,1077],{"class":1070},[1053,2680,1087],{"class":1086},[1053,2682,1090],{"class":1070},[1053,2684,2685,2687,2689,2691,2693],{"class":1055,"line":1093},[1053,2686,1172],{"class":1171},[1053,2688,1175],{"class":1066},[1053,2690,1178],{"class":1171},[1053,2692,1101],{"class":1066},[1053,2694,1409],{"class":1070},[1053,2696,2697,2699,2701,2703,2705,2707,2709,2711,2713],{"class":1055,"line":1125},[1053,2698,1198],{"class":1197},[1053,2700,1109],{"class":1070},[1053,2702,1203],{"class":1086},[1053,2704,1077],{"class":1070},[1053,2706,1380],{"class":1080},[1053,2708,1077],{"class":1070},[1053,2710,1452],{"class":1080},[1053,2712,1499],{"class":1070},[1053,2714,2715],{"class":1059},"  # New query for each article\n",[1053,2717,2718],{"class":1055,"line":1155},[1053,2719,1159],{"emptyLinePlaceholder":1158},[1053,2721,2722],{"class":1055,"line":1162},[1053,2723,2724],{"class":1059},"# With select_related: 1 query\n",[1053,2726,2727,2729,2731,2733,2735,2737,2739,2741,2743,2745,2747,2749,2751,2753],{"class":1055,"line":1168},[1053,2728,1067],{"class":1066},[1053,2730,1071],{"class":1070},[1053,2732,1074],{"class":1066},[1053,2734,1077],{"class":1070},[1053,2736,1081],{"class":1080},[1053,2738,1077],{"class":1070},[1053,2740,1373],{"class":1086},[1053,2742,1109],{"class":1070},[1053,2744,1144],{"class":1143},[1053,2746,1380],{"class":1147},[1053,2748,1144],{"class":1143},[1053,2750,1385],{"class":1070},[1053,2752,1087],{"class":1086},[1053,2754,1090],{"class":1070},[1053,2756,2757,2759,2761,2763,2765],{"class":1055,"line":1194},[1053,2758,1172],{"class":1171},[1053,2760,1175],{"class":1066},[1053,2762,1178],{"class":1171},[1053,2764,1101],{"class":1066},[1053,2766,1409],{"class":1070},[1053,2768,2769,2771,2773,2775,2777,2779,2781,2783,2785],{"class":1055,"line":1213},[1053,2770,1198],{"class":1197},[1053,2772,1109],{"class":1070},[1053,2774,1203],{"class":1086},[1053,2776,1077],{"class":1070},[1053,2778,1380],{"class":1080},[1053,2780,1077],{"class":1070},[1053,2782,1452],{"class":1080},[1053,2784,1499],{"class":1070},[1053,2786,2787],{"class":1059},"  # No additional query\n",[1035,2789,2791],{"id":2790},"multiple-relations","Multiple Relations",[1043,2793,2795],{"className":1045,"code":2794,"language":1047,"meta":1048,"style":1048},"# Select multiple related objects\narticles = Article.objects.select_related(\n    'author',\n    'category',\n    'author__profile'  # Follow foreign keys through multiple levels\n).all()\n\n# Generated SQL includes JOINs:\n# SELECT article.*, author.*, category.*, profile.*\n# FROM article\n# JOIN author ON article.author_id = author.id\n# JOIN category ON article.category_id = category.id\n# JOIN profile ON author.profile_id = profile.id\n",[1050,2796,2797,2802,2820,2831,2841,2853,2861,2865,2870,2875,2880,2885,2890],{"__ignoreMap":1048},[1053,2798,2799],{"class":1055,"line":1056},[1053,2800,2801],{"class":1059},"# Select multiple related objects\n",[1053,2803,2804,2806,2808,2810,2812,2814,2816,2818],{"class":1055,"line":1063},[1053,2805,1067],{"class":1066},[1053,2807,1071],{"class":1070},[1053,2809,1074],{"class":1066},[1053,2811,1077],{"class":1070},[1053,2813,1081],{"class":1080},[1053,2815,1077],{"class":1070},[1053,2817,1373],{"class":1086},[1053,2819,1836],{"class":1070},[1053,2821,2822,2825,2827,2829],{"class":1055,"line":1093},[1053,2823,2824],{"class":1143},"    '",[1053,2826,1380],{"class":1147},[1053,2828,1144],{"class":1143},[1053,2830,1848],{"class":1070},[1053,2832,2833,2835,2837,2839],{"class":1055,"line":1125},[1053,2834,2824],{"class":1143},[1053,2836,1711],{"class":1147},[1053,2838,1144],{"class":1143},[1053,2840,1848],{"class":1070},[1053,2842,2843,2845,2848,2850],{"class":1055,"line":1155},[1053,2844,2824],{"class":1143},[1053,2846,2847],{"class":1147},"author__profile",[1053,2849,1144],{"class":1143},[1053,2851,2852],{"class":1059},"  # Follow foreign keys through multiple levels\n",[1053,2854,2855,2857,2859],{"class":1055,"line":1162},[1053,2856,1385],{"class":1070},[1053,2858,1087],{"class":1086},[1053,2860,1090],{"class":1070},[1053,2862,2863],{"class":1055,"line":1168},[1053,2864,1159],{"emptyLinePlaceholder":1158},[1053,2866,2867],{"class":1055,"line":1194},[1053,2868,2869],{"class":1059},"# Generated SQL includes JOINs:\n",[1053,2871,2872],{"class":1055,"line":1213},[1053,2873,2874],{"class":1059},"# SELECT article.*, author.*, category.*, profile.*\n",[1053,2876,2877],{"class":1055,"line":1218},[1053,2878,2879],{"class":1059},"# FROM article\n",[1053,2881,2882],{"class":1055,"line":1224},[1053,2883,2884],{"class":1059},"# JOIN author ON article.author_id = author.id\n",[1053,2886,2887],{"class":1055,"line":1412},[1053,2888,2889],{"class":1059},"# JOIN category ON article.category_id = category.id\n",[1053,2891,2892],{"class":1055,"line":1461},[1053,2893,2894],{"class":1059},"# JOIN profile ON author.profile_id = profile.id\n",[1035,2896,2898],{"id":2897},"conditional-select-related","Conditional Select Related",[1043,2900,2902],{"className":1045,"code":2901,"language":1047,"meta":1048,"style":1048},"def get_articles_with_related(include_author=True, include_category=True):\n    queryset = Article.objects.all()\n    \n    select_related_fields = []\n    if include_author:\n        select_related_fields.append('author')\n    if include_category:\n        select_related_fields.append('category')\n    \n    if select_related_fields:\n        queryset = queryset.select_related(*select_related_fields)\n    \n    return queryset\n",[1050,2903,2904,2931,2950,2954,2964,2974,2994,3002,3020,3024,3033,3057,3061],{"__ignoreMap":1048},[1053,2905,2906,2908,2911,2913,2916,2918,2920,2922,2925,2927,2929],{"class":1055,"line":1056},[1053,2907,1317],{"class":1316},[1053,2909,2910],{"class":1299}," get_articles_with_related",[1053,2912,1109],{"class":1070},[1053,2914,2915],{"class":1627},"include_author",[1053,2917,1071],{"class":2238},[1053,2919,1119],{"class":1118},[1053,2921,1767],{"class":1070},[1053,2923,2924],{"class":1627}," include_category",[1053,2926,1071],{"class":2238},[1053,2928,1119],{"class":1118},[1053,2930,1631],{"class":1070},[1053,2932,2933,2936,2938,2940,2942,2944,2946,2948],{"class":1055,"line":1063},[1053,2934,2935],{"class":1066},"    queryset ",[1053,2937,1071],{"class":1070},[1053,2939,1074],{"class":1066},[1053,2941,1077],{"class":1070},[1053,2943,1081],{"class":1080},[1053,2945,1077],{"class":1070},[1053,2947,1087],{"class":1086},[1053,2949,1090],{"class":1070},[1053,2951,2952],{"class":1055,"line":1093},[1053,2953,1350],{"class":1066},[1053,2955,2956,2959,2961],{"class":1055,"line":1125},[1053,2957,2958],{"class":1066},"    select_related_fields ",[1053,2960,1071],{"class":1070},[1053,2962,2963],{"class":1070}," []\n",[1053,2965,2966,2969,2972],{"class":1055,"line":1155},[1053,2967,2968],{"class":1171},"    if",[1053,2970,2971],{"class":1066}," include_author",[1053,2973,1409],{"class":1070},[1053,2975,2976,2979,2981,2984,2986,2988,2990,2992],{"class":1055,"line":1162},[1053,2977,2978],{"class":1066},"        select_related_fields",[1053,2980,1077],{"class":1070},[1053,2982,2983],{"class":1086},"append",[1053,2985,1109],{"class":1070},[1053,2987,1144],{"class":1143},[1053,2989,1380],{"class":1147},[1053,2991,1144],{"class":1143},[1053,2993,1122],{"class":1070},[1053,2995,2996,2998,3000],{"class":1055,"line":1168},[1053,2997,2968],{"class":1171},[1053,2999,2924],{"class":1066},[1053,3001,1409],{"class":1070},[1053,3003,3004,3006,3008,3010,3012,3014,3016,3018],{"class":1055,"line":1194},[1053,3005,2978],{"class":1066},[1053,3007,1077],{"class":1070},[1053,3009,2983],{"class":1086},[1053,3011,1109],{"class":1070},[1053,3013,1144],{"class":1143},[1053,3015,1711],{"class":1147},[1053,3017,1144],{"class":1143},[1053,3019,1122],{"class":1070},[1053,3021,3022],{"class":1055,"line":1213},[1053,3023,1350],{"class":1066},[1053,3025,3026,3028,3031],{"class":1055,"line":1218},[1053,3027,2968],{"class":1171},[1053,3029,3030],{"class":1066}," select_related_fields",[1053,3032,1409],{"class":1070},[1053,3034,3035,3038,3040,3043,3045,3047,3049,3052,3055],{"class":1055,"line":1224},[1053,3036,3037],{"class":1066},"        queryset ",[1053,3039,1071],{"class":1070},[1053,3041,3042],{"class":1066}," queryset",[1053,3044,1077],{"class":1070},[1053,3046,1373],{"class":1086},[1053,3048,1109],{"class":1070},[1053,3050,3051],{"class":2238},"*",[1053,3053,3054],{"class":1086},"select_related_fields",[1053,3056,1122],{"class":1070},[1053,3058,3059],{"class":1055,"line":1412},[1053,3060,1350],{"class":1066},[1053,3062,3063,3065],{"class":1055,"line":1461},[1053,3064,1757],{"class":1171},[1053,3066,3067],{"class":1066}," queryset\n",[1035,3069,3071],{"id":3070},"select-related-performance-analysis","Select Related Performance Analysis",[1043,3073,3075],{"className":1045,"code":3074,"language":1047,"meta":1048,"style":1048},"import time\nfrom django.test import TestCase\n\nclass SelectRelatedPerformanceTest(TestCase):\n    def setUp(self):\n        # Create test data\n        for i in range(100):\n            author = Author.objects.create(name=f\"Author {i}\")\n            Article.objects.create(\n                title=f\"Article {i}\",\n                author=author,\n                content=\"Test content\"\n            )\n    \n    def test_without_select_related(self):\n        start_time = time.time()\n        \n        articles = Article.objects.all()\n        author_names = [article.author.name for article in articles]\n        \n        end_time = time.time()\n        print(f\"Without select_related: {end_time - start_time:.4f}s\")\n        print(f\"Queries executed: {len(connection.queries)}\")\n    \n    def test_with_select_related(self):\n        start_time = time.time()\n        \n        articles = Article.objects.select_related('author').all()\n        author_names = [article.author.name for article in articles]\n        \n        end_time = time.time()\n        print(f\"With select_related: {end_time - start_time:.4f}s\")\n        print(f\"Queries executed: {len(connection.queries)}\")\n",[1050,3076,3077,3084,3100,3104,3118,3131,3136,3155,3196,3211,3233,3244,3259,3264,3268,3281,3297,3301,3320,3351,3355,3370,3401,3432,3436,3449,3463,3467,3497,3525,3529,3543,3570],{"__ignoreMap":1048},[1053,3078,3079,3081],{"class":1055,"line":1056},[1053,3080,1263],{"class":1171},[1053,3082,3083],{"class":1066}," time\n",[1053,3085,3086,3088,3090,3092,3095,3097],{"class":1055,"line":1063},[1053,3087,1252],{"class":1171},[1053,3089,1255],{"class":1066},[1053,3091,1077],{"class":1070},[1053,3093,3094],{"class":1066},"test ",[1053,3096,1263],{"class":1171},[1053,3098,3099],{"class":1066}," TestCase\n",[1053,3101,3102],{"class":1055,"line":1093},[1053,3103,1159],{"emptyLinePlaceholder":1158},[1053,3105,3106,3108,3111,3113,3116],{"class":1055,"line":1125},[1053,3107,2109],{"class":1316},[1053,3109,3110],{"class":2112}," SelectRelatedPerformanceTest",[1053,3112,1109],{"class":1070},[1053,3114,3115],{"class":2118},"TestCase",[1053,3117,1631],{"class":1070},[1053,3119,3120,3122,3125,3127,3129],{"class":1055,"line":1155},[1053,3121,2126],{"class":1316},[1053,3123,3124],{"class":1299}," setUp",[1053,3126,1109],{"class":1070},[1053,3128,2135],{"class":2134},[1053,3130,1631],{"class":1070},[1053,3132,3133],{"class":1055,"line":1162},[1053,3134,3135],{"class":1059},"        # Create test data\n",[1053,3137,3138,3140,3143,3145,3148,3150,3153],{"class":1055,"line":1168},[1053,3139,2469],{"class":1171},[1053,3141,3142],{"class":1066}," i ",[1053,3144,1178],{"class":1171},[1053,3146,3147],{"class":1197}," range",[1053,3149,1109],{"class":1070},[1053,3151,3152],{"class":1187},"100",[1053,3154,1631],{"class":1070},[1053,3156,3157,3160,3162,3165,3167,3169,3171,3174,3176,3178,3180,3182,3185,3187,3190,3192,3194],{"class":1055,"line":1194},[1053,3158,3159],{"class":1066},"            author ",[1053,3161,1071],{"class":1070},[1053,3163,3164],{"class":1066}," Author",[1053,3166,1077],{"class":1070},[1053,3168,1081],{"class":1080},[1053,3170,1077],{"class":1070},[1053,3172,3173],{"class":1086},"create",[1053,3175,1109],{"class":1070},[1053,3177,1452],{"class":1112},[1053,3179,1071],{"class":1070},[1053,3181,1420],{"class":1316},[1053,3183,3184],{"class":1147},"\"Author ",[1053,3186,1427],{"class":1426},[1053,3188,3189],{"class":1086},"i",[1053,3191,1436],{"class":1426},[1053,3193,1423],{"class":1147},[1053,3195,1122],{"class":1070},[1053,3197,3198,3201,3203,3205,3207,3209],{"class":1055,"line":1213},[1053,3199,3200],{"class":1066},"            Article",[1053,3202,1077],{"class":1070},[1053,3204,1081],{"class":1080},[1053,3206,1077],{"class":1070},[1053,3208,3173],{"class":1086},[1053,3210,1836],{"class":1070},[1053,3212,3213,3216,3218,3220,3223,3225,3227,3229,3231],{"class":1055,"line":1218},[1053,3214,3215],{"class":1112},"                title",[1053,3217,1071],{"class":1070},[1053,3219,1420],{"class":1316},[1053,3221,3222],{"class":1147},"\"Article ",[1053,3224,1427],{"class":1426},[1053,3226,3189],{"class":1086},[1053,3228,1436],{"class":1426},[1053,3230,1423],{"class":1147},[1053,3232,1848],{"class":1070},[1053,3234,3235,3238,3240,3242],{"class":1055,"line":1224},[1053,3236,3237],{"class":1112},"                author",[1053,3239,1071],{"class":1070},[1053,3241,1380],{"class":1086},[1053,3243,1848],{"class":1070},[1053,3245,3246,3249,3251,3253,3256],{"class":1055,"line":1412},[1053,3247,3248],{"class":1112},"                content",[1053,3250,1071],{"class":1070},[1053,3252,1423],{"class":1143},[1053,3254,3255],{"class":1147},"Test content",[1053,3257,3258],{"class":1143},"\"\n",[1053,3260,3261],{"class":1055,"line":1461},[1053,3262,3263],{"class":1070},"            )\n",[1053,3265,3266],{"class":1055,"line":1466},[1053,3267,1350],{"class":1066},[1053,3269,3270,3272,3275,3277,3279],{"class":1055,"line":1472},[1053,3271,2126],{"class":1316},[1053,3273,3274],{"class":1299}," test_without_select_related",[1053,3276,1109],{"class":1070},[1053,3278,2135],{"class":2134},[1053,3280,1631],{"class":1070},[1053,3282,3283,3286,3288,3291,3293,3295],{"class":1055,"line":1508},[1053,3284,3285],{"class":1066},"        start_time ",[1053,3287,1071],{"class":1070},[1053,3289,3290],{"class":1066}," time",[1053,3292,1077],{"class":1070},[1053,3294,1583],{"class":1086},[1053,3296,1090],{"class":1070},[1053,3298,3299],{"class":1055,"line":1527},[1053,3300,2406],{"class":1066},[1053,3302,3303,3306,3308,3310,3312,3314,3316,3318],{"class":1055,"line":1563},[1053,3304,3305],{"class":1066},"        articles ",[1053,3307,1071],{"class":1070},[1053,3309,1074],{"class":1066},[1053,3311,1077],{"class":1070},[1053,3313,1081],{"class":1080},[1053,3315,1077],{"class":1070},[1053,3317,1087],{"class":1086},[1053,3319,1090],{"class":1070},[1053,3321,3322,3325,3327,3330,3332,3334,3336,3338,3340,3343,3345,3347,3349],{"class":1055,"line":1860},[1053,3323,3324],{"class":1066},"        author_names ",[1053,3326,1071],{"class":1070},[1053,3328,3329],{"class":1070}," [",[1053,3331,1203],{"class":1066},[1053,3333,1077],{"class":1070},[1053,3335,1380],{"class":1080},[1053,3337,1077],{"class":1070},[1053,3339,1452],{"class":1080},[1053,3341,3342],{"class":1171}," for",[1053,3344,1175],{"class":1066},[1053,3346,1178],{"class":1171},[1053,3348,1101],{"class":1066},[1053,3350,1395],{"class":1070},[1053,3352,3353],{"class":1055,"line":1871},[1053,3354,2406],{"class":1066},[1053,3356,3357,3360,3362,3364,3366,3368],{"class":1055,"line":1880},[1053,3358,3359],{"class":1066},"        end_time ",[1053,3361,1071],{"class":1070},[1053,3363,3290],{"class":1066},[1053,3365,1077],{"class":1070},[1053,3367,1583],{"class":1086},[1053,3369,1090],{"class":1070},[1053,3371,3372,3374,3376,3378,3381,3383,3386,3389,3392,3395,3397,3399],{"class":1055,"line":1896},[1053,3373,1415],{"class":1197},[1053,3375,1109],{"class":1070},[1053,3377,1420],{"class":1316},[1053,3379,3380],{"class":1147},"\"Without select_related: ",[1053,3382,1427],{"class":1426},[1053,3384,3385],{"class":1086},"end_time ",[1053,3387,3388],{"class":2238},"-",[1053,3390,3391],{"class":1086}," start_time",[1053,3393,3394],{"class":1316},":.4f",[1053,3396,1436],{"class":1426},[1053,3398,1592],{"class":1147},[1053,3400,1122],{"class":1070},[1053,3402,3403,3405,3407,3409,3412,3414,3416,3418,3420,3422,3424,3426,3428,3430],{"class":1055,"line":1901},[1053,3404,1415],{"class":1197},[1053,3406,1109],{"class":1070},[1053,3408,1420],{"class":1316},[1053,3410,3411],{"class":1147},"\"Queries executed: ",[1053,3413,1427],{"class":1426},[1053,3415,1486],{"class":1197},[1053,3417,1109],{"class":1070},[1053,3419,1491],{"class":1086},[1053,3421,1077],{"class":1070},[1053,3423,1496],{"class":1080},[1053,3425,1499],{"class":1070},[1053,3427,1436],{"class":1426},[1053,3429,1423],{"class":1147},[1053,3431,1122],{"class":1070},[1053,3433,3434],{"class":1055,"line":1914},[1053,3435,1350],{"class":1066},[1053,3437,3438,3440,3443,3445,3447],{"class":1055,"line":1936},[1053,3439,2126],{"class":1316},[1053,3441,3442],{"class":1299}," test_with_select_related",[1053,3444,1109],{"class":1070},[1053,3446,2135],{"class":2134},[1053,3448,1631],{"class":1070},[1053,3450,3451,3453,3455,3457,3459,3461],{"class":1055,"line":1958},[1053,3452,3285],{"class":1066},[1053,3454,1071],{"class":1070},[1053,3456,3290],{"class":1066},[1053,3458,1077],{"class":1070},[1053,3460,1583],{"class":1086},[1053,3462,1090],{"class":1070},[1053,3464,3465],{"class":1055,"line":1980},[1053,3466,2406],{"class":1066},[1053,3468,3469,3471,3473,3475,3477,3479,3481,3483,3485,3487,3489,3491,3493,3495],{"class":1055,"line":1985},[1053,3470,3305],{"class":1066},[1053,3472,1071],{"class":1070},[1053,3474,1074],{"class":1066},[1053,3476,1077],{"class":1070},[1053,3478,1081],{"class":1080},[1053,3480,1077],{"class":1070},[1053,3482,1373],{"class":1086},[1053,3484,1109],{"class":1070},[1053,3486,1144],{"class":1143},[1053,3488,1380],{"class":1147},[1053,3490,1144],{"class":1143},[1053,3492,1385],{"class":1070},[1053,3494,1087],{"class":1086},[1053,3496,1090],{"class":1070},[1053,3498,3499,3501,3503,3505,3507,3509,3511,3513,3515,3517,3519,3521,3523],{"class":1055,"line":2417},[1053,3500,3324],{"class":1066},[1053,3502,1071],{"class":1070},[1053,3504,3329],{"class":1070},[1053,3506,1203],{"class":1066},[1053,3508,1077],{"class":1070},[1053,3510,1380],{"class":1080},[1053,3512,1077],{"class":1070},[1053,3514,1452],{"class":1080},[1053,3516,3342],{"class":1171},[1053,3518,1175],{"class":1066},[1053,3520,1178],{"class":1171},[1053,3522,1101],{"class":1066},[1053,3524,1395],{"class":1070},[1053,3526,3527],{"class":1055,"line":2422},[1053,3528,2406],{"class":1066},[1053,3530,3531,3533,3535,3537,3539,3541],{"class":1055,"line":2441},[1053,3532,3359],{"class":1066},[1053,3534,1071],{"class":1070},[1053,3536,3290],{"class":1066},[1053,3538,1077],{"class":1070},[1053,3540,1583],{"class":1086},[1053,3542,1090],{"class":1070},[1053,3544,3545,3547,3549,3551,3554,3556,3558,3560,3562,3564,3566,3568],{"class":1055,"line":2455},[1053,3546,1415],{"class":1197},[1053,3548,1109],{"class":1070},[1053,3550,1420],{"class":1316},[1053,3552,3553],{"class":1147},"\"With select_related: ",[1053,3555,1427],{"class":1426},[1053,3557,3385],{"class":1086},[1053,3559,3388],{"class":2238},[1053,3561,3391],{"class":1086},[1053,3563,3394],{"class":1316},[1053,3565,1436],{"class":1426},[1053,3567,1592],{"class":1147},[1053,3569,1122],{"class":1070},[1053,3571,3572,3574,3576,3578,3580,3582,3584,3586,3588,3590,3592,3594,3596,3598],{"class":1055,"line":2466},[1053,3573,1415],{"class":1197},[1053,3575,1109],{"class":1070},[1053,3577,1420],{"class":1316},[1053,3579,3411],{"class":1147},[1053,3581,1427],{"class":1426},[1053,3583,1486],{"class":1197},[1053,3585,1109],{"class":1070},[1053,3587,1491],{"class":1086},[1053,3589,1077],{"class":1070},[1053,3591,1496],{"class":1080},[1053,3593,1499],{"class":1070},[1053,3595,1436],{"class":1426},[1053,3597,1423],{"class":1147},[1053,3599,1122],{"class":1070},[1030,3601,3603],{"id":3602},"prefetch-related-optimization","Prefetch Related Optimization",[1026,3605,3606,3608],{},[1050,3607,1866],{}," handles many-to-many and reverse foreign key relationships:",[1035,3610,3612],{"id":3611},"basic-prefetch-related","Basic Prefetch Related",[1043,3614,3616],{"className":1045,"code":3615,"language":1047,"meta":1048,"style":1048},"# Without prefetch_related: 1 + N queries\narticles = Article.objects.all()\nfor article in articles:\n    tags = list(article.tags.all())  # New query for each article\n\n# With prefetch_related: 2 queries\narticles = Article.objects.prefetch_related('tags').all()\nfor article in articles:\n    tags = list(article.tags.all())  # No additional query\n",[1050,3617,3618,3623,3641,3653,3680,3684,3689,3719,3731],{"__ignoreMap":1048},[1053,3619,3620],{"class":1055,"line":1056},[1053,3621,3622],{"class":1059},"# Without prefetch_related: 1 + N queries\n",[1053,3624,3625,3627,3629,3631,3633,3635,3637,3639],{"class":1055,"line":1063},[1053,3626,1067],{"class":1066},[1053,3628,1071],{"class":1070},[1053,3630,1074],{"class":1066},[1053,3632,1077],{"class":1070},[1053,3634,1081],{"class":1080},[1053,3636,1077],{"class":1070},[1053,3638,1087],{"class":1086},[1053,3640,1090],{"class":1070},[1053,3642,3643,3645,3647,3649,3651],{"class":1055,"line":1093},[1053,3644,1172],{"class":1171},[1053,3646,1175],{"class":1066},[1053,3648,1178],{"class":1171},[1053,3650,1101],{"class":1066},[1053,3652,1409],{"class":1070},[1053,3654,3655,3658,3660,3664,3666,3668,3670,3672,3674,3676,3678],{"class":1055,"line":1125},[1053,3656,3657],{"class":1066},"    tags ",[1053,3659,1071],{"class":1070},[1053,3661,3663],{"class":3662},"sa2tF"," list",[1053,3665,1109],{"class":1070},[1053,3667,1203],{"class":1086},[1053,3669,1077],{"class":1070},[1053,3671,1733],{"class":1080},[1053,3673,1077],{"class":1070},[1053,3675,1087],{"class":1086},[1053,3677,1740],{"class":1070},[1053,3679,2715],{"class":1059},[1053,3681,3682],{"class":1055,"line":1155},[1053,3683,1159],{"emptyLinePlaceholder":1158},[1053,3685,3686],{"class":1055,"line":1162},[1053,3687,3688],{"class":1059},"# With prefetch_related: 2 queries\n",[1053,3690,3691,3693,3695,3697,3699,3701,3703,3705,3707,3709,3711,3713,3715,3717],{"class":1055,"line":1168},[1053,3692,1067],{"class":1066},[1053,3694,1071],{"class":1070},[1053,3696,1074],{"class":1066},[1053,3698,1077],{"class":1070},[1053,3700,1081],{"class":1080},[1053,3702,1077],{"class":1070},[1053,3704,1866],{"class":1086},[1053,3706,1109],{"class":1070},[1053,3708,1144],{"class":1143},[1053,3710,1733],{"class":1147},[1053,3712,1144],{"class":1143},[1053,3714,1385],{"class":1070},[1053,3716,1087],{"class":1086},[1053,3718,1090],{"class":1070},[1053,3720,3721,3723,3725,3727,3729],{"class":1055,"line":1194},[1053,3722,1172],{"class":1171},[1053,3724,1175],{"class":1066},[1053,3726,1178],{"class":1171},[1053,3728,1101],{"class":1066},[1053,3730,1409],{"class":1070},[1053,3732,3733,3735,3737,3739,3741,3743,3745,3747,3749,3751,3753],{"class":1055,"line":1213},[1053,3734,3657],{"class":1066},[1053,3736,1071],{"class":1070},[1053,3738,3663],{"class":3662},[1053,3740,1109],{"class":1070},[1053,3742,1203],{"class":1086},[1053,3744,1077],{"class":1070},[1053,3746,1733],{"class":1080},[1053,3748,1077],{"class":1070},[1053,3750,1087],{"class":1086},[1053,3752,1740],{"class":1070},[1053,3754,2787],{"class":1059},[1035,3756,3758],{"id":3757},"advanced-prefetch-patterns","Advanced Prefetch Patterns",[1043,3760,3762],{"className":1045,"code":3761,"language":1047,"meta":1048,"style":1048},"from django.db.models import Prefetch\n\n# Custom prefetch with filtering\narticles = Article.objects.prefetch_related(\n    Prefetch(\n        'comments',\n        queryset=Comment.objects.filter(is_approved=True).select_related('author'),\n        to_attr='approved_comments'\n    )\n).all()\n\n# Access prefetched data\nfor article in articles:\n    for comment in article.approved_comments:\n        print(f\"Comment by {comment.author.name}: {comment.content}\")\n",[1050,3763,3764,3785,3789,3794,3812,3819,3830,3872,3886,3891,3899,3903,3908,3920,3938],{"__ignoreMap":1048},[1053,3765,3766,3768,3770,3772,3775,3777,3780,3782],{"class":1055,"line":1056},[1053,3767,1252],{"class":1171},[1053,3769,1255],{"class":1066},[1053,3771,1077],{"class":1070},[1053,3773,3774],{"class":1066},"db",[1053,3776,1077],{"class":1070},[1053,3778,3779],{"class":1066},"models ",[1053,3781,1263],{"class":1171},[1053,3783,3784],{"class":1066}," Prefetch\n",[1053,3786,3787],{"class":1055,"line":1063},[1053,3788,1159],{"emptyLinePlaceholder":1158},[1053,3790,3791],{"class":1055,"line":1093},[1053,3792,3793],{"class":1059},"# Custom prefetch with filtering\n",[1053,3795,3796,3798,3800,3802,3804,3806,3808,3810],{"class":1055,"line":1125},[1053,3797,1067],{"class":1066},[1053,3799,1071],{"class":1070},[1053,3801,1074],{"class":1066},[1053,3803,1077],{"class":1070},[1053,3805,1081],{"class":1080},[1053,3807,1077],{"class":1070},[1053,3809,1866],{"class":1086},[1053,3811,1836],{"class":1070},[1053,3813,3814,3817],{"class":1055,"line":1155},[1053,3815,3816],{"class":1086},"    Prefetch",[1053,3818,1836],{"class":1070},[1053,3820,3821,3823,3826,3828],{"class":1055,"line":1162},[1053,3822,1841],{"class":1143},[1053,3824,3825],{"class":1147},"comments",[1053,3827,1144],{"class":1143},[1053,3829,1848],{"class":1070},[1053,3831,3832,3835,3837,3840,3842,3844,3846,3848,3850,3853,3855,3857,3859,3861,3863,3865,3867,3869],{"class":1055,"line":1168},[1053,3833,3834],{"class":1112},"        queryset",[1053,3836,1071],{"class":1070},[1053,3838,3839],{"class":1086},"Comment",[1053,3841,1077],{"class":1070},[1053,3843,1081],{"class":1080},[1053,3845,1077],{"class":1070},[1053,3847,1106],{"class":1086},[1053,3849,1109],{"class":1070},[1053,3851,3852],{"class":1112},"is_approved",[1053,3854,1071],{"class":1070},[1053,3856,1119],{"class":1118},[1053,3858,1385],{"class":1070},[1053,3860,1373],{"class":1086},[1053,3862,1109],{"class":1070},[1053,3864,1144],{"class":1143},[1053,3866,1380],{"class":1147},[1053,3868,1144],{"class":1143},[1053,3870,3871],{"class":1070},"),\n",[1053,3873,3874,3877,3879,3881,3884],{"class":1055,"line":1194},[1053,3875,3876],{"class":1112},"        to_attr",[1053,3878,1071],{"class":1070},[1053,3880,1144],{"class":1143},[1053,3882,3883],{"class":1147},"approved_comments",[1053,3885,1857],{"class":1143},[1053,3887,3888],{"class":1055,"line":1213},[1053,3889,3890],{"class":1070},"    )\n",[1053,3892,3893,3895,3897],{"class":1055,"line":1218},[1053,3894,1385],{"class":1070},[1053,3896,1087],{"class":1086},[1053,3898,1090],{"class":1070},[1053,3900,3901],{"class":1055,"line":1224},[1053,3902,1159],{"emptyLinePlaceholder":1158},[1053,3904,3905],{"class":1055,"line":1412},[1053,3906,3907],{"class":1059},"# Access prefetched data\n",[1053,3909,3910,3912,3914,3916,3918],{"class":1055,"line":1461},[1053,3911,1172],{"class":1171},[1053,3913,1175],{"class":1066},[1053,3915,1178],{"class":1171},[1053,3917,1101],{"class":1066},[1053,3919,1409],{"class":1070},[1053,3921,3922,3924,3927,3929,3932,3934,3936],{"class":1055,"line":1466},[1053,3923,1400],{"class":1171},[1053,3925,3926],{"class":1066}," comment ",[1053,3928,1178],{"class":1171},[1053,3930,3931],{"class":1066}," article",[1053,3933,1077],{"class":1070},[1053,3935,3883],{"class":1080},[1053,3937,1409],{"class":1070},[1053,3939,3940,3942,3944,3946,3949,3951,3954,3956,3958,3960,3962,3964,3967,3969,3971,3973,3976,3978,3980],{"class":1055,"line":1472},[1053,3941,1415],{"class":1197},[1053,3943,1109],{"class":1070},[1053,3945,1420],{"class":1316},[1053,3947,3948],{"class":1147},"\"Comment by ",[1053,3950,1427],{"class":1426},[1053,3952,3953],{"class":1086},"comment",[1053,3955,1077],{"class":1070},[1053,3957,1380],{"class":1080},[1053,3959,1077],{"class":1070},[1053,3961,1452],{"class":1080},[1053,3963,1436],{"class":1426},[1053,3965,3966],{"class":1147},": ",[1053,3968,1427],{"class":1426},[1053,3970,3953],{"class":1086},[1053,3972,1077],{"class":1070},[1053,3974,3975],{"class":1080},"content",[1053,3977,1436],{"class":1426},[1053,3979,1423],{"class":1147},[1053,3981,1122],{"class":1070},[1035,3983,3985],{"id":3984},"nested-prefetching","Nested Prefetching",[1043,3987,3989],{"className":1045,"code":3988,"language":1047,"meta":1048,"style":1048},"# Prefetch related objects of related objects\narticles = Article.objects.prefetch_related(\n    'tags',\n    'comments__author',\n    'comments__replies'\n).all()\n\n# Multiple levels of prefetching\nusers = User.objects.prefetch_related(\n    'articles__tags',\n    'articles__comments__author'\n).all()\n",[1050,3990,3991,3996,4014,4024,4035,4044,4052,4056,4061,4081,4092,4101],{"__ignoreMap":1048},[1053,3992,3993],{"class":1055,"line":1056},[1053,3994,3995],{"class":1059},"# Prefetch related objects of related objects\n",[1053,3997,3998,4000,4002,4004,4006,4008,4010,4012],{"class":1055,"line":1063},[1053,3999,1067],{"class":1066},[1053,4001,1071],{"class":1070},[1053,4003,1074],{"class":1066},[1053,4005,1077],{"class":1070},[1053,4007,1081],{"class":1080},[1053,4009,1077],{"class":1070},[1053,4011,1866],{"class":1086},[1053,4013,1836],{"class":1070},[1053,4015,4016,4018,4020,4022],{"class":1055,"line":1093},[1053,4017,2824],{"class":1143},[1053,4019,1733],{"class":1147},[1053,4021,1144],{"class":1143},[1053,4023,1848],{"class":1070},[1053,4025,4026,4028,4031,4033],{"class":1055,"line":1125},[1053,4027,2824],{"class":1143},[1053,4029,4030],{"class":1147},"comments__author",[1053,4032,1144],{"class":1143},[1053,4034,1848],{"class":1070},[1053,4036,4037,4039,4042],{"class":1055,"line":1155},[1053,4038,2824],{"class":1143},[1053,4040,4041],{"class":1147},"comments__replies",[1053,4043,1857],{"class":1143},[1053,4045,4046,4048,4050],{"class":1055,"line":1162},[1053,4047,1385],{"class":1070},[1053,4049,1087],{"class":1086},[1053,4051,1090],{"class":1070},[1053,4053,4054],{"class":1055,"line":1168},[1053,4055,1159],{"emptyLinePlaceholder":1158},[1053,4057,4058],{"class":1055,"line":1194},[1053,4059,4060],{"class":1059},"# Multiple levels of prefetching\n",[1053,4062,4063,4066,4068,4071,4073,4075,4077,4079],{"class":1055,"line":1213},[1053,4064,4065],{"class":1066},"users ",[1053,4067,1071],{"class":1070},[1053,4069,4070],{"class":1066}," User",[1053,4072,1077],{"class":1070},[1053,4074,1081],{"class":1080},[1053,4076,1077],{"class":1070},[1053,4078,1866],{"class":1086},[1053,4080,1836],{"class":1070},[1053,4082,4083,4085,4088,4090],{"class":1055,"line":1218},[1053,4084,2824],{"class":1143},[1053,4086,4087],{"class":1147},"articles__tags",[1053,4089,1144],{"class":1143},[1053,4091,1848],{"class":1070},[1053,4093,4094,4096,4099],{"class":1055,"line":1224},[1053,4095,2824],{"class":1143},[1053,4097,4098],{"class":1147},"articles__comments__author",[1053,4100,1857],{"class":1143},[1053,4102,4103,4105,4107],{"class":1055,"line":1412},[1053,4104,1385],{"class":1070},[1053,4106,1087],{"class":1086},[1053,4108,1090],{"class":1070},[1035,4110,4112],{"id":4111},"prefetch-with-annotations","Prefetch with Annotations",[1043,4114,4116],{"className":1045,"code":4115,"language":1047,"meta":1048,"style":1048},"from django.db.models import Count, Avg\n\n# Prefetch with aggregations\narticles = Article.objects.prefetch_related(\n    Prefetch(\n        'comments',\n        queryset=Comment.objects.annotate(\n            reply_count=Count('replies')\n        ).select_related('author')\n    )\n).all()\n",[1050,4117,4118,4142,4146,4151,4169,4175,4185,4204,4225,4242,4246],{"__ignoreMap":1048},[1053,4119,4120,4122,4124,4126,4128,4130,4132,4134,4137,4139],{"class":1055,"line":1056},[1053,4121,1252],{"class":1171},[1053,4123,1255],{"class":1066},[1053,4125,1077],{"class":1070},[1053,4127,3774],{"class":1066},[1053,4129,1077],{"class":1070},[1053,4131,3779],{"class":1066},[1053,4133,1263],{"class":1171},[1053,4135,4136],{"class":1066}," Count",[1053,4138,1767],{"class":1070},[1053,4140,4141],{"class":1066}," Avg\n",[1053,4143,4144],{"class":1055,"line":1063},[1053,4145,1159],{"emptyLinePlaceholder":1158},[1053,4147,4148],{"class":1055,"line":1093},[1053,4149,4150],{"class":1059},"# Prefetch with aggregations\n",[1053,4152,4153,4155,4157,4159,4161,4163,4165,4167],{"class":1055,"line":1125},[1053,4154,1067],{"class":1066},[1053,4156,1071],{"class":1070},[1053,4158,1074],{"class":1066},[1053,4160,1077],{"class":1070},[1053,4162,1081],{"class":1080},[1053,4164,1077],{"class":1070},[1053,4166,1866],{"class":1086},[1053,4168,1836],{"class":1070},[1053,4170,4171,4173],{"class":1055,"line":1155},[1053,4172,3816],{"class":1086},[1053,4174,1836],{"class":1070},[1053,4176,4177,4179,4181,4183],{"class":1055,"line":1162},[1053,4178,1841],{"class":1143},[1053,4180,3825],{"class":1147},[1053,4182,1144],{"class":1143},[1053,4184,1848],{"class":1070},[1053,4186,4187,4189,4191,4193,4195,4197,4199,4202],{"class":1055,"line":1168},[1053,4188,3834],{"class":1112},[1053,4190,1071],{"class":1070},[1053,4192,3839],{"class":1086},[1053,4194,1077],{"class":1070},[1053,4196,1081],{"class":1080},[1053,4198,1077],{"class":1070},[1053,4200,4201],{"class":1086},"annotate",[1053,4203,1836],{"class":1070},[1053,4205,4206,4209,4211,4214,4216,4218,4221,4223],{"class":1055,"line":1194},[1053,4207,4208],{"class":1112},"            reply_count",[1053,4210,1071],{"class":1070},[1053,4212,4213],{"class":1086},"Count",[1053,4215,1109],{"class":1070},[1053,4217,1144],{"class":1143},[1053,4219,4220],{"class":1147},"replies",[1053,4222,1144],{"class":1143},[1053,4224,1122],{"class":1070},[1053,4226,4227,4230,4232,4234,4236,4238,4240],{"class":1055,"line":1213},[1053,4228,4229],{"class":1070},"        ).",[1053,4231,1373],{"class":1086},[1053,4233,1109],{"class":1070},[1053,4235,1144],{"class":1143},[1053,4237,1380],{"class":1147},[1053,4239,1144],{"class":1143},[1053,4241,1122],{"class":1070},[1053,4243,4244],{"class":1055,"line":1218},[1053,4245,3890],{"class":1070},[1053,4247,4248,4250,4252],{"class":1055,"line":1224},[1053,4249,1385],{"class":1070},[1053,4251,1087],{"class":1086},[1053,4253,1090],{"class":1070},[1030,4255,4257],{"id":4256},"query-optimization-techniques","Query Optimization Techniques",[1035,4259,4261],{"id":4260},"using-only-and-defer","Using Only and Defer",[1026,4263,4264],{},"Limit the fields retrieved from the database:",[1043,4266,4268],{"className":1045,"code":4267,"language":1047,"meta":1048,"style":1048},"# Only retrieve specific fields\narticles = Article.objects.only('title', 'slug', 'created_at').all()\n\n# Defer expensive fields\narticles = Article.objects.defer('content', 'metadata').all()\n\n# Combining with select_related\narticles = Article.objects.select_related('author').only(\n    'title', 'slug', 'author__name'\n).all()\n",[1050,4269,4270,4275,4324,4328,4333,4373,4377,4382,4412,4437],{"__ignoreMap":1048},[1053,4271,4272],{"class":1055,"line":1056},[1053,4273,4274],{"class":1059},"# Only retrieve specific fields\n",[1053,4276,4277,4279,4281,4283,4285,4287,4289,4292,4294,4296,4298,4300,4302,4304,4307,4309,4311,4313,4316,4318,4320,4322],{"class":1055,"line":1063},[1053,4278,1067],{"class":1066},[1053,4280,1071],{"class":1070},[1053,4282,1074],{"class":1066},[1053,4284,1077],{"class":1070},[1053,4286,1081],{"class":1080},[1053,4288,1077],{"class":1070},[1053,4290,4291],{"class":1086},"only",[1053,4293,1109],{"class":1070},[1053,4295,1144],{"class":1143},[1053,4297,1208],{"class":1147},[1053,4299,1144],{"class":1143},[1053,4301,1767],{"class":1070},[1053,4303,1770],{"class":1143},[1053,4305,4306],{"class":1147},"slug",[1053,4308,1144],{"class":1143},[1053,4310,1767],{"class":1070},[1053,4312,1770],{"class":1143},[1053,4314,4315],{"class":1147},"created_at",[1053,4317,1144],{"class":1143},[1053,4319,1385],{"class":1070},[1053,4321,1087],{"class":1086},[1053,4323,1090],{"class":1070},[1053,4325,4326],{"class":1055,"line":1093},[1053,4327,1159],{"emptyLinePlaceholder":1158},[1053,4329,4330],{"class":1055,"line":1125},[1053,4331,4332],{"class":1059},"# Defer expensive fields\n",[1053,4334,4335,4337,4339,4341,4343,4345,4347,4350,4352,4354,4356,4358,4360,4362,4365,4367,4369,4371],{"class":1055,"line":1155},[1053,4336,1067],{"class":1066},[1053,4338,1071],{"class":1070},[1053,4340,1074],{"class":1066},[1053,4342,1077],{"class":1070},[1053,4344,1081],{"class":1080},[1053,4346,1077],{"class":1070},[1053,4348,4349],{"class":1086},"defer",[1053,4351,1109],{"class":1070},[1053,4353,1144],{"class":1143},[1053,4355,3975],{"class":1147},[1053,4357,1144],{"class":1143},[1053,4359,1767],{"class":1070},[1053,4361,1770],{"class":1143},[1053,4363,4364],{"class":1147},"metadata",[1053,4366,1144],{"class":1143},[1053,4368,1385],{"class":1070},[1053,4370,1087],{"class":1086},[1053,4372,1090],{"class":1070},[1053,4374,4375],{"class":1055,"line":1162},[1053,4376,1159],{"emptyLinePlaceholder":1158},[1053,4378,4379],{"class":1055,"line":1168},[1053,4380,4381],{"class":1059},"# Combining with select_related\n",[1053,4383,4384,4386,4388,4390,4392,4394,4396,4398,4400,4402,4404,4406,4408,4410],{"class":1055,"line":1194},[1053,4385,1067],{"class":1066},[1053,4387,1071],{"class":1070},[1053,4389,1074],{"class":1066},[1053,4391,1077],{"class":1070},[1053,4393,1081],{"class":1080},[1053,4395,1077],{"class":1070},[1053,4397,1373],{"class":1086},[1053,4399,1109],{"class":1070},[1053,4401,1144],{"class":1143},[1053,4403,1380],{"class":1147},[1053,4405,1144],{"class":1143},[1053,4407,1385],{"class":1070},[1053,4409,4291],{"class":1086},[1053,4411,1836],{"class":1070},[1053,4413,4414,4416,4418,4420,4422,4424,4426,4428,4430,4432,4435],{"class":1055,"line":1213},[1053,4415,2824],{"class":1143},[1053,4417,1208],{"class":1147},[1053,4419,1144],{"class":1143},[1053,4421,1767],{"class":1070},[1053,4423,1770],{"class":1143},[1053,4425,4306],{"class":1147},[1053,4427,1144],{"class":1143},[1053,4429,1767],{"class":1070},[1053,4431,1770],{"class":1143},[1053,4433,4434],{"class":1147},"author__name",[1053,4436,1857],{"class":1143},[1053,4438,4439,4441,4443],{"class":1055,"line":1218},[1053,4440,1385],{"class":1070},[1053,4442,1087],{"class":1086},[1053,4444,1090],{"class":1070},[1035,4446,4448],{"id":4447},"database-functions-and-aggregations","Database Functions and Aggregations",[1026,4450,4451],{},"Perform calculations in the database instead of Python:",[1043,4453,4455],{"className":1045,"code":4454,"language":1047,"meta":1048,"style":1048},"from django.db.models import Count, Sum, Avg, F, Case, When\n\n# Aggregations\nstats = Article.objects.aggregate(\n    total_articles=Count('id'),\n    avg_word_count=Avg('word_count'),\n    total_views=Sum('view_count')\n)\n\n# Annotations\narticles = Article.objects.annotate(\n    comment_count=Count('comments'),\n    avg_rating=Avg('ratings__score'),\n    is_popular=Case(\n        When(view_count__gt=1000, then=True),\n        default=False\n    )\n).all()\n\n# F expressions for database-level operations\nArticle.objects.filter(view_count__gt=F('comment_count') * 10)\n",[1050,4456,4457,4500,4504,4509,4529,4549,4570,4591,4595,4599,4604,4622,4641,4661,4673,4699,4709,4713,4721,4725,4730],{"__ignoreMap":1048},[1053,4458,4459,4461,4463,4465,4467,4469,4471,4473,4475,4477,4480,4482,4485,4487,4490,4492,4495,4497],{"class":1055,"line":1056},[1053,4460,1252],{"class":1171},[1053,4462,1255],{"class":1066},[1053,4464,1077],{"class":1070},[1053,4466,3774],{"class":1066},[1053,4468,1077],{"class":1070},[1053,4470,3779],{"class":1066},[1053,4472,1263],{"class":1171},[1053,4474,4136],{"class":1066},[1053,4476,1767],{"class":1070},[1053,4478,4479],{"class":1066}," Sum",[1053,4481,1767],{"class":1070},[1053,4483,4484],{"class":1066}," Avg",[1053,4486,1767],{"class":1070},[1053,4488,4489],{"class":1066}," F",[1053,4491,1767],{"class":1070},[1053,4493,4494],{"class":1066}," Case",[1053,4496,1767],{"class":1070},[1053,4498,4499],{"class":1066}," When\n",[1053,4501,4502],{"class":1055,"line":1063},[1053,4503,1159],{"emptyLinePlaceholder":1158},[1053,4505,4506],{"class":1055,"line":1093},[1053,4507,4508],{"class":1059},"# Aggregations\n",[1053,4510,4511,4514,4516,4518,4520,4522,4524,4527],{"class":1055,"line":1125},[1053,4512,4513],{"class":1066},"stats ",[1053,4515,1071],{"class":1070},[1053,4517,1074],{"class":1066},[1053,4519,1077],{"class":1070},[1053,4521,1081],{"class":1080},[1053,4523,1077],{"class":1070},[1053,4525,4526],{"class":1086},"aggregate",[1053,4528,1836],{"class":1070},[1053,4530,4531,4534,4536,4538,4540,4542,4545,4547],{"class":1055,"line":1155},[1053,4532,4533],{"class":1112},"    total_articles",[1053,4535,1071],{"class":1070},[1053,4537,4213],{"class":1086},[1053,4539,1109],{"class":1070},[1053,4541,1144],{"class":1143},[1053,4543,4544],{"class":1147},"id",[1053,4546,1144],{"class":1143},[1053,4548,3871],{"class":1070},[1053,4550,4551,4554,4556,4559,4561,4563,4566,4568],{"class":1055,"line":1162},[1053,4552,4553],{"class":1112},"    avg_word_count",[1053,4555,1071],{"class":1070},[1053,4557,4558],{"class":1086},"Avg",[1053,4560,1109],{"class":1070},[1053,4562,1144],{"class":1143},[1053,4564,4565],{"class":1147},"word_count",[1053,4567,1144],{"class":1143},[1053,4569,3871],{"class":1070},[1053,4571,4572,4575,4577,4580,4582,4584,4587,4589],{"class":1055,"line":1168},[1053,4573,4574],{"class":1112},"    total_views",[1053,4576,1071],{"class":1070},[1053,4578,4579],{"class":1086},"Sum",[1053,4581,1109],{"class":1070},[1053,4583,1144],{"class":1143},[1053,4585,4586],{"class":1147},"view_count",[1053,4588,1144],{"class":1143},[1053,4590,1122],{"class":1070},[1053,4592,4593],{"class":1055,"line":1194},[1053,4594,1122],{"class":1070},[1053,4596,4597],{"class":1055,"line":1213},[1053,4598,1159],{"emptyLinePlaceholder":1158},[1053,4600,4601],{"class":1055,"line":1218},[1053,4602,4603],{"class":1059},"# Annotations\n",[1053,4605,4606,4608,4610,4612,4614,4616,4618,4620],{"class":1055,"line":1224},[1053,4607,1067],{"class":1066},[1053,4609,1071],{"class":1070},[1053,4611,1074],{"class":1066},[1053,4613,1077],{"class":1070},[1053,4615,1081],{"class":1080},[1053,4617,1077],{"class":1070},[1053,4619,4201],{"class":1086},[1053,4621,1836],{"class":1070},[1053,4623,4624,4627,4629,4631,4633,4635,4637,4639],{"class":1055,"line":1412},[1053,4625,4626],{"class":1112},"    comment_count",[1053,4628,1071],{"class":1070},[1053,4630,4213],{"class":1086},[1053,4632,1109],{"class":1070},[1053,4634,1144],{"class":1143},[1053,4636,3825],{"class":1147},[1053,4638,1144],{"class":1143},[1053,4640,3871],{"class":1070},[1053,4642,4643,4646,4648,4650,4652,4654,4657,4659],{"class":1055,"line":1461},[1053,4644,4645],{"class":1112},"    avg_rating",[1053,4647,1071],{"class":1070},[1053,4649,4558],{"class":1086},[1053,4651,1109],{"class":1070},[1053,4653,1144],{"class":1143},[1053,4655,4656],{"class":1147},"ratings__score",[1053,4658,1144],{"class":1143},[1053,4660,3871],{"class":1070},[1053,4662,4663,4666,4668,4671],{"class":1055,"line":1466},[1053,4664,4665],{"class":1112},"    is_popular",[1053,4667,1071],{"class":1070},[1053,4669,4670],{"class":1086},"Case",[1053,4672,1836],{"class":1070},[1053,4674,4675,4678,4680,4683,4685,4688,4690,4693,4695,4697],{"class":1055,"line":1472},[1053,4676,4677],{"class":1086},"        When",[1053,4679,1109],{"class":1070},[1053,4681,4682],{"class":1112},"view_count__gt",[1053,4684,1071],{"class":1070},[1053,4686,4687],{"class":1187},"1000",[1053,4689,1767],{"class":1070},[1053,4691,4692],{"class":1112}," then",[1053,4694,1071],{"class":1070},[1053,4696,1119],{"class":1118},[1053,4698,3871],{"class":1070},[1053,4700,4701,4704,4706],{"class":1055,"line":1508},[1053,4702,4703],{"class":1112},"        default",[1053,4705,1071],{"class":1070},[1053,4707,4708],{"class":1118},"False\n",[1053,4710,4711],{"class":1055,"line":1527},[1053,4712,3890],{"class":1070},[1053,4714,4715,4717,4719],{"class":1055,"line":1563},[1053,4716,1385],{"class":1070},[1053,4718,1087],{"class":1086},[1053,4720,1090],{"class":1070},[1053,4722,4723],{"class":1055,"line":1860},[1053,4724,1159],{"emptyLinePlaceholder":1158},[1053,4726,4727],{"class":1055,"line":1871},[1053,4728,4729],{"class":1059},"# F expressions for database-level operations\n",[1053,4731,4732,4735,4737,4739,4741,4743,4745,4747,4749,4752,4754,4756,4759,4761,4763,4766,4768],{"class":1055,"line":1880},[1053,4733,4734],{"class":1066},"Article",[1053,4736,1077],{"class":1070},[1053,4738,1081],{"class":1080},[1053,4740,1077],{"class":1070},[1053,4742,1106],{"class":1086},[1053,4744,1109],{"class":1070},[1053,4746,4682],{"class":1112},[1053,4748,1071],{"class":1070},[1053,4750,4751],{"class":1086},"F",[1053,4753,1109],{"class":1070},[1053,4755,1144],{"class":1143},[1053,4757,4758],{"class":1147},"comment_count",[1053,4760,1144],{"class":1143},[1053,4762,1499],{"class":1070},[1053,4764,4765],{"class":2238}," *",[1053,4767,2270],{"class":1187},[1053,4769,1122],{"class":1070},[1035,4771,4773],{"id":4772},"bulk-operations","Bulk Operations",[1026,4775,4776],{},"Use bulk operations for better performance:",[1043,4778,4780],{"className":1045,"code":4779,"language":1047,"meta":1048,"style":1048},"# Bulk create\narticles = [\n    Article(title=f\"Article {i}\", content=f\"Content {i}\")\n    for i in range(1000)\n]\nArticle.objects.bulk_create(articles, batch_size=100)\n\n# Bulk update\nArticle.objects.filter(is_published=False).bulk_update([\n    Article(id=1, view_count=100),\n    Article(id=2, view_count=200),\n], ['view_count'], batch_size=100)\n\n# Bulk delete\nArticle.objects.filter(created_at__lt=timezone.now() - timedelta(days=365)).delete()\n",[1050,4781,4782,4787,4796,4841,4857,4861,4889,4893,4898,4927,4951,4975,4998,5002,5007],{"__ignoreMap":1048},[1053,4783,4784],{"class":1055,"line":1056},[1053,4785,4786],{"class":1059},"# Bulk create\n",[1053,4788,4789,4791,4793],{"class":1055,"line":1063},[1053,4790,1067],{"class":1066},[1053,4792,1071],{"class":1070},[1053,4794,4795],{"class":1070}," [\n",[1053,4797,4798,4801,4803,4805,4807,4809,4811,4813,4815,4817,4819,4821,4824,4826,4828,4831,4833,4835,4837,4839],{"class":1055,"line":1093},[1053,4799,4800],{"class":1086},"    Article",[1053,4802,1109],{"class":1070},[1053,4804,1208],{"class":1112},[1053,4806,1071],{"class":1070},[1053,4808,1420],{"class":1316},[1053,4810,3222],{"class":1147},[1053,4812,1427],{"class":1426},[1053,4814,3189],{"class":1086},[1053,4816,1436],{"class":1426},[1053,4818,1423],{"class":1147},[1053,4820,1767],{"class":1070},[1053,4822,4823],{"class":1112}," content",[1053,4825,1071],{"class":1070},[1053,4827,1420],{"class":1316},[1053,4829,4830],{"class":1147},"\"Content ",[1053,4832,1427],{"class":1426},[1053,4834,3189],{"class":1086},[1053,4836,1436],{"class":1426},[1053,4838,1423],{"class":1147},[1053,4840,1122],{"class":1070},[1053,4842,4843,4845,4847,4849,4851,4853,4855],{"class":1055,"line":1125},[1053,4844,1400],{"class":1171},[1053,4846,3142],{"class":1066},[1053,4848,1178],{"class":1171},[1053,4850,3147],{"class":1197},[1053,4852,1109],{"class":1070},[1053,4854,4687],{"class":1187},[1053,4856,1122],{"class":1070},[1053,4858,4859],{"class":1055,"line":1155},[1053,4860,1395],{"class":1070},[1053,4862,4863,4865,4867,4869,4871,4874,4876,4878,4880,4883,4885,4887],{"class":1055,"line":1162},[1053,4864,4734],{"class":1066},[1053,4866,1077],{"class":1070},[1053,4868,1081],{"class":1080},[1053,4870,1077],{"class":1070},[1053,4872,4873],{"class":1086},"bulk_create",[1053,4875,1109],{"class":1070},[1053,4877,1785],{"class":1086},[1053,4879,1767],{"class":1070},[1053,4881,4882],{"class":1112}," batch_size",[1053,4884,1071],{"class":1070},[1053,4886,3152],{"class":1187},[1053,4888,1122],{"class":1070},[1053,4890,4891],{"class":1055,"line":1168},[1053,4892,1159],{"emptyLinePlaceholder":1158},[1053,4894,4895],{"class":1055,"line":1194},[1053,4896,4897],{"class":1059},"# Bulk update\n",[1053,4899,4900,4902,4904,4906,4908,4910,4912,4914,4916,4919,4921,4924],{"class":1055,"line":1213},[1053,4901,4734],{"class":1066},[1053,4903,1077],{"class":1070},[1053,4905,1081],{"class":1080},[1053,4907,1077],{"class":1070},[1053,4909,1106],{"class":1086},[1053,4911,1109],{"class":1070},[1053,4913,1113],{"class":1112},[1053,4915,1071],{"class":1070},[1053,4917,4918],{"class":1118},"False",[1053,4920,1385],{"class":1070},[1053,4922,4923],{"class":1086},"bulk_update",[1053,4925,4926],{"class":1070},"([\n",[1053,4928,4929,4931,4933,4935,4937,4940,4942,4945,4947,4949],{"class":1055,"line":1218},[1053,4930,4800],{"class":1086},[1053,4932,1109],{"class":1070},[1053,4934,4544],{"class":1112},[1053,4936,1071],{"class":1070},[1053,4938,4939],{"class":1187},"1",[1053,4941,1767],{"class":1070},[1053,4943,4944],{"class":1112}," view_count",[1053,4946,1071],{"class":1070},[1053,4948,3152],{"class":1187},[1053,4950,3871],{"class":1070},[1053,4952,4953,4955,4957,4959,4961,4964,4966,4968,4970,4973],{"class":1055,"line":1224},[1053,4954,4800],{"class":1086},[1053,4956,1109],{"class":1070},[1053,4958,4544],{"class":1112},[1053,4960,1071],{"class":1070},[1053,4962,4963],{"class":1187},"2",[1053,4965,1767],{"class":1070},[1053,4967,4944],{"class":1112},[1053,4969,1071],{"class":1070},[1053,4971,4972],{"class":1187},"200",[1053,4974,3871],{"class":1070},[1053,4976,4977,4980,4982,4984,4986,4988,4990,4992,4994,4996],{"class":1055,"line":1412},[1053,4978,4979],{"class":1070},"],",[1053,4981,3329],{"class":1070},[1053,4983,1144],{"class":1143},[1053,4985,4586],{"class":1147},[1053,4987,1144],{"class":1143},[1053,4989,4979],{"class":1070},[1053,4991,4882],{"class":1112},[1053,4993,1071],{"class":1070},[1053,4995,3152],{"class":1187},[1053,4997,1122],{"class":1070},[1053,4999,5000],{"class":1055,"line":1461},[1053,5001,1159],{"emptyLinePlaceholder":1158},[1053,5003,5004],{"class":1055,"line":1466},[1053,5005,5006],{"class":1059},"# Bulk delete\n",[1053,5008,5009,5011,5013,5015,5017,5019,5021,5024,5026,5029,5031,5034,5036,5038,5041,5043,5046,5048,5051,5054,5057],{"class":1055,"line":1472},[1053,5010,4734],{"class":1066},[1053,5012,1077],{"class":1070},[1053,5014,1081],{"class":1080},[1053,5016,1077],{"class":1070},[1053,5018,1106],{"class":1086},[1053,5020,1109],{"class":1070},[1053,5022,5023],{"class":1112},"created_at__lt",[1053,5025,1071],{"class":1070},[1053,5027,5028],{"class":1086},"timezone",[1053,5030,1077],{"class":1070},[1053,5032,5033],{"class":1086},"now",[1053,5035,2628],{"class":1070},[1053,5037,2239],{"class":2238},[1053,5039,5040],{"class":1086}," timedelta",[1053,5042,1109],{"class":1070},[1053,5044,5045],{"class":1112},"days",[1053,5047,1071],{"class":1070},[1053,5049,5050],{"class":1187},"365",[1053,5052,5053],{"class":1070},")).",[1053,5055,5056],{"class":1086},"delete",[1053,5058,1090],{"class":1070},[1035,5060,5062],{"id":5061},"raw-sql-for-complex-queries","Raw SQL for Complex Queries",[1026,5064,5065],{},"Sometimes raw SQL is more efficient:",[1043,5067,5069],{"className":1045,"code":5068,"language":1047,"meta":1048,"style":1048},"# Complex query that's hard to express in ORM\narticles = Article.objects.raw(\"\"\"\n    SELECT a.*, \n           COUNT(c.id) as comment_count,\n           AVG(r.score) as avg_rating\n    FROM articles_article a\n    LEFT JOIN articles_comment c ON a.id = c.article_id\n    LEFT JOIN articles_rating r ON a.id = r.article_id\n    WHERE a.is_published = true\n    GROUP BY a.id\n    HAVING COUNT(c.id) > 5\n    ORDER BY avg_rating DESC, comment_count DESC\n    LIMIT 10\n\"\"\")\n\n# Using extra() for database functions\narticles = Article.objects.extra(\n    select={\n        'comment_count': 'SELECT COUNT(*) FROM comments WHERE article_id = articles_article.id'\n    }\n).all()\n",[1050,5070,5071,5076,5097,5102,5107,5112,5117,5122,5127,5132,5137,5142,5147,5152,5159,5163,5168,5187,5195,5212,5217],{"__ignoreMap":1048},[1053,5072,5073],{"class":1055,"line":1056},[1053,5074,5075],{"class":1059},"# Complex query that's hard to express in ORM\n",[1053,5077,5078,5080,5082,5084,5086,5088,5090,5093,5095],{"class":1055,"line":1063},[1053,5079,1067],{"class":1066},[1053,5081,1071],{"class":1070},[1053,5083,1074],{"class":1066},[1053,5085,1077],{"class":1070},[1053,5087,1081],{"class":1080},[1053,5089,1077],{"class":1070},[1053,5091,5092],{"class":1086},"raw",[1053,5094,1109],{"class":1070},[1053,5096,2452],{"class":1143},[1053,5098,5099],{"class":1055,"line":1093},[1053,5100,5101],{"class":1147},"    SELECT a.*, \n",[1053,5103,5104],{"class":1055,"line":1125},[1053,5105,5106],{"class":1147},"           COUNT(c.id) as comment_count,\n",[1053,5108,5109],{"class":1055,"line":1155},[1053,5110,5111],{"class":1147},"           AVG(r.score) as avg_rating\n",[1053,5113,5114],{"class":1055,"line":1162},[1053,5115,5116],{"class":1147},"    FROM articles_article a\n",[1053,5118,5119],{"class":1055,"line":1168},[1053,5120,5121],{"class":1147},"    LEFT JOIN articles_comment c ON a.id = c.article_id\n",[1053,5123,5124],{"class":1055,"line":1194},[1053,5125,5126],{"class":1147},"    LEFT JOIN articles_rating r ON a.id = r.article_id\n",[1053,5128,5129],{"class":1055,"line":1213},[1053,5130,5131],{"class":1147},"    WHERE a.is_published = true\n",[1053,5133,5134],{"class":1055,"line":1218},[1053,5135,5136],{"class":1147},"    GROUP BY a.id\n",[1053,5138,5139],{"class":1055,"line":1224},[1053,5140,5141],{"class":1147},"    HAVING COUNT(c.id) > 5\n",[1053,5143,5144],{"class":1055,"line":1412},[1053,5145,5146],{"class":1147},"    ORDER BY avg_rating DESC, comment_count DESC\n",[1053,5148,5149],{"class":1055,"line":1461},[1053,5150,5151],{"class":1147},"    LIMIT 10\n",[1053,5153,5154,5157],{"class":1055,"line":1466},[1053,5155,5156],{"class":1143},"\"\"\"",[1053,5158,1122],{"class":1070},[1053,5160,5161],{"class":1055,"line":1472},[1053,5162,1159],{"emptyLinePlaceholder":1158},[1053,5164,5165],{"class":1055,"line":1508},[1053,5166,5167],{"class":1059},"# Using extra() for database functions\n",[1053,5169,5170,5172,5174,5176,5178,5180,5182,5185],{"class":1055,"line":1527},[1053,5171,1067],{"class":1066},[1053,5173,1071],{"class":1070},[1053,5175,1074],{"class":1066},[1053,5177,1077],{"class":1070},[1053,5179,1081],{"class":1080},[1053,5181,1077],{"class":1070},[1053,5183,5184],{"class":1086},"extra",[1053,5186,1836],{"class":1070},[1053,5188,5189,5192],{"class":1055,"line":1563},[1053,5190,5191],{"class":1112},"    select",[1053,5193,5194],{"class":1070},"={\n",[1053,5196,5197,5199,5201,5203,5205,5207,5210],{"class":1055,"line":1860},[1053,5198,1841],{"class":1143},[1053,5200,4758],{"class":1147},[1053,5202,1144],{"class":1143},[1053,5204,1790],{"class":1070},[1053,5206,1770],{"class":1143},[1053,5208,5209],{"class":1147},"SELECT COUNT(*) FROM comments WHERE article_id = articles_article.id",[1053,5211,1857],{"class":1143},[1053,5213,5214],{"class":1055,"line":1871},[1053,5215,5216],{"class":1070},"    }\n",[1053,5218,5219,5221,5223],{"class":1055,"line":1880},[1053,5220,1385],{"class":1070},[1053,5222,1087],{"class":1086},[1053,5224,1090],{"class":1070},[1030,5226,5228],{"id":5227},"database-index-optimization","Database Index Optimization",[1035,5230,5232],{"id":5231},"identifying-missing-indexes","Identifying Missing Indexes",[1043,5234,5236],{"className":1045,"code":5235,"language":1047,"meta":1048,"style":1048},"# Django management command to analyze slow queries\nfrom django.core.management.base import BaseCommand\nfrom django.db import connection\n\nclass Command(BaseCommand):\n    help = 'Analyze slow queries and suggest indexes'\n    \n    def handle(self, *args, **options):\n        with connection.cursor() as cursor:\n            # PostgreSQL: Find slow queries\n            cursor.execute(\"\"\"\n                SELECT query, mean_time, calls, total_time\n                FROM pg_stat_statements\n                WHERE mean_time > 100\n                ORDER BY mean_time DESC\n                LIMIT 10\n            \"\"\")\n            \n            slow_queries = cursor.fetchall()\n            \n            for query, mean_time, calls, total_time in slow_queries:\n                self.stdout.write(f\"Query: {query[:100]}...\")\n                self.stdout.write(f\"Mean time: {mean_time}ms\")\n                self.stdout.write(f\"Calls: {calls}\")\n                self.stdout.write(\"---\")\n",[1050,5237,5238,5243,5269,5283,5287,5301,5315,5319,5347,5369,5374,5388,5393,5398,5403,5408,5413,5420,5424,5440,5444,5473,5511,5542,5572],{"__ignoreMap":1048},[1053,5239,5240],{"class":1055,"line":1056},[1053,5241,5242],{"class":1059},"# Django management command to analyze slow queries\n",[1053,5244,5245,5247,5249,5251,5254,5256,5259,5261,5264,5266],{"class":1055,"line":1063},[1053,5246,1252],{"class":1171},[1053,5248,1255],{"class":1066},[1053,5250,1077],{"class":1070},[1053,5252,5253],{"class":1066},"core",[1053,5255,1077],{"class":1070},[1053,5257,5258],{"class":1066},"management",[1053,5260,1077],{"class":1070},[1053,5262,5263],{"class":1066},"base ",[1053,5265,1263],{"class":1171},[1053,5267,5268],{"class":1066}," BaseCommand\n",[1053,5270,5271,5273,5275,5277,5279,5281],{"class":1055,"line":1093},[1053,5272,1252],{"class":1171},[1053,5274,1255],{"class":1066},[1053,5276,1077],{"class":1070},[1053,5278,1260],{"class":1066},[1053,5280,1263],{"class":1171},[1053,5282,1266],{"class":1066},[1053,5284,5285],{"class":1055,"line":1125},[1053,5286,1159],{"emptyLinePlaceholder":1158},[1053,5288,5289,5291,5294,5296,5299],{"class":1055,"line":1155},[1053,5290,2109],{"class":1316},[1053,5292,5293],{"class":2112}," Command",[1053,5295,1109],{"class":1070},[1053,5297,5298],{"class":2118},"BaseCommand",[1053,5300,1631],{"class":1070},[1053,5302,5303,5306,5308,5310,5313],{"class":1055,"line":1162},[1053,5304,5305],{"class":1197},"    help",[1053,5307,2155],{"class":1070},[1053,5309,1770],{"class":1143},[1053,5311,5312],{"class":1147},"Analyze slow queries and suggest indexes",[1053,5314,1857],{"class":1143},[1053,5316,5317],{"class":1055,"line":1168},[1053,5318,1350],{"class":1066},[1053,5320,5321,5323,5326,5328,5330,5332,5334,5337,5339,5342,5345],{"class":1055,"line":1194},[1053,5322,2126],{"class":1316},[1053,5324,5325],{"class":1299}," handle",[1053,5327,1109],{"class":1070},[1053,5329,2135],{"class":2134},[1053,5331,1767],{"class":1070},[1053,5333,4765],{"class":2238},[1053,5335,5336],{"class":1627},"args",[1053,5338,1767],{"class":1070},[1053,5340,5341],{"class":2238}," **",[1053,5343,5344],{"class":1627},"options",[1053,5346,1631],{"class":1070},[1053,5348,5349,5352,5354,5356,5359,5361,5364,5367],{"class":1055,"line":1213},[1053,5350,5351],{"class":1171},"        with",[1053,5353,1518],{"class":1066},[1053,5355,1077],{"class":1070},[1053,5357,5358],{"class":1086},"cursor",[1053,5360,2628],{"class":1070},[1053,5362,5363],{"class":1171}," as",[1053,5365,5366],{"class":1066}," cursor",[1053,5368,1409],{"class":1070},[1053,5370,5371],{"class":1055,"line":1218},[1053,5372,5373],{"class":1059},"            # PostgreSQL: Find slow queries\n",[1053,5375,5376,5379,5381,5384,5386],{"class":1055,"line":1224},[1053,5377,5378],{"class":1066},"            cursor",[1053,5380,1077],{"class":1070},[1053,5382,5383],{"class":1086},"execute",[1053,5385,1109],{"class":1070},[1053,5387,2452],{"class":1143},[1053,5389,5390],{"class":1055,"line":1412},[1053,5391,5392],{"class":1147},"                SELECT query, mean_time, calls, total_time\n",[1053,5394,5395],{"class":1055,"line":1461},[1053,5396,5397],{"class":1147},"                FROM pg_stat_statements\n",[1053,5399,5400],{"class":1055,"line":1466},[1053,5401,5402],{"class":1147},"                WHERE mean_time > 100\n",[1053,5404,5405],{"class":1055,"line":1472},[1053,5406,5407],{"class":1147},"                ORDER BY mean_time DESC\n",[1053,5409,5410],{"class":1055,"line":1508},[1053,5411,5412],{"class":1147},"                LIMIT 10\n",[1053,5414,5415,5418],{"class":1055,"line":1527},[1053,5416,5417],{"class":1143},"            \"\"\"",[1053,5419,1122],{"class":1070},[1053,5421,5422],{"class":1055,"line":1563},[1053,5423,2251],{"class":1066},[1053,5425,5426,5429,5431,5433,5435,5438],{"class":1055,"line":1860},[1053,5427,5428],{"class":1066},"            slow_queries ",[1053,5430,1071],{"class":1070},[1053,5432,5366],{"class":1066},[1053,5434,1077],{"class":1070},[1053,5436,5437],{"class":1086},"fetchall",[1053,5439,1090],{"class":1070},[1053,5441,5442],{"class":1055,"line":1871},[1053,5443,2251],{"class":1066},[1053,5445,5446,5449,5451,5453,5456,5458,5461,5463,5466,5468,5471],{"class":1055,"line":1880},[1053,5447,5448],{"class":1171},"            for",[1053,5450,2530],{"class":1066},[1053,5452,1767],{"class":1070},[1053,5454,5455],{"class":1066}," mean_time",[1053,5457,1767],{"class":1070},[1053,5459,5460],{"class":1066}," calls",[1053,5462,1767],{"class":1070},[1053,5464,5465],{"class":1066}," total_time ",[1053,5467,1178],{"class":1171},[1053,5469,5470],{"class":1066}," slow_queries",[1053,5472,1409],{"class":1070},[1053,5474,5475,5478,5480,5483,5485,5488,5490,5492,5494,5496,5498,5500,5502,5504,5506,5509],{"class":1055,"line":1896},[1053,5476,5477],{"class":2282},"                self",[1053,5479,1077],{"class":1070},[1053,5481,5482],{"class":1080},"stdout",[1053,5484,1077],{"class":1070},[1053,5486,5487],{"class":1086},"write",[1053,5489,1109],{"class":1070},[1053,5491,1420],{"class":1316},[1053,5493,1536],{"class":1147},[1053,5495,1427],{"class":1426},[1053,5497,1541],{"class":1086},[1053,5499,1184],{"class":1070},[1053,5501,3152],{"class":1187},[1053,5503,1554],{"class":1070},[1053,5505,1436],{"class":1426},[1053,5507,5508],{"class":1147},"...\"",[1053,5510,1122],{"class":1070},[1053,5512,5513,5515,5517,5519,5521,5523,5525,5527,5530,5532,5535,5537,5540],{"class":1055,"line":1901},[1053,5514,5477],{"class":2282},[1053,5516,1077],{"class":1070},[1053,5518,5482],{"class":1080},[1053,5520,1077],{"class":1070},[1053,5522,5487],{"class":1086},[1053,5524,1109],{"class":1070},[1053,5526,1420],{"class":1316},[1053,5528,5529],{"class":1147},"\"Mean time: ",[1053,5531,1427],{"class":1426},[1053,5533,5534],{"class":1086},"mean_time",[1053,5536,1436],{"class":1426},[1053,5538,5539],{"class":1147},"ms\"",[1053,5541,1122],{"class":1070},[1053,5543,5544,5546,5548,5550,5552,5554,5556,5558,5561,5563,5566,5568,5570],{"class":1055,"line":1914},[1053,5545,5477],{"class":2282},[1053,5547,1077],{"class":1070},[1053,5549,5482],{"class":1080},[1053,5551,1077],{"class":1070},[1053,5553,5487],{"class":1086},[1053,5555,1109],{"class":1070},[1053,5557,1420],{"class":1316},[1053,5559,5560],{"class":1147},"\"Calls: ",[1053,5562,1427],{"class":1426},[1053,5564,5565],{"class":1086},"calls",[1053,5567,1436],{"class":1426},[1053,5569,1423],{"class":1147},[1053,5571,1122],{"class":1070},[1053,5573,5574,5576,5578,5580,5582,5584,5586,5588,5591,5593],{"class":1055,"line":1936},[1053,5575,5477],{"class":2282},[1053,5577,1077],{"class":1070},[1053,5579,5482],{"class":1080},[1053,5581,1077],{"class":1070},[1053,5583,5487],{"class":1086},[1053,5585,1109],{"class":1070},[1053,5587,1423],{"class":1143},[1053,5589,5590],{"class":1147},"---",[1053,5592,1423],{"class":1143},[1053,5594,1122],{"class":1070},[1035,5596,5598],{"id":5597},"creating-effective-indexes","Creating Effective Indexes",[1043,5600,5602],{"className":1045,"code":5601,"language":1047,"meta":1048,"style":1048},"# models.py\nfrom django.db import models\n\nclass Article(models.Model):\n    title = models.CharField(max_length=200)\n    slug = models.SlugField(unique=True)\n    author = models.ForeignKey(User, on_delete=models.CASCADE)\n    category = models.ForeignKey(Category, on_delete=models.CASCADE)\n    is_published = models.BooleanField(default=False)\n    created_at = models.DateTimeField(auto_now_add=True)\n    view_count = models.PositiveIntegerField(default=0)\n    \n    class Meta:\n        # Single column indexes\n        indexes = [\n            models.Index(fields=['is_published']),\n            models.Index(fields=['created_at']),\n            models.Index(fields=['view_count']),\n        ]\n        \n        # Composite indexes for common query patterns\n        indexes = [\n            # For queries filtering by published status and ordering by date\n            models.Index(fields=['is_published', '-created_at']),\n            \n            # For queries filtering by category and published status\n            models.Index(fields=['category', 'is_published']),\n            \n            # For full-text search (PostgreSQL)\n            models.Index(fields=['title', 'content']),\n        ]\n\n# Migration for adding indexes\nfrom django.db import migrations, models\n\nclass Migration(migrations.Migration):\n    dependencies = [\n        ('articles', '0001_initial'),\n    ]\n    \n    operations = [\n        migrations.RunSQL(\n            # PostgreSQL: Create partial index\n            \"CREATE INDEX CONCURRENTLY idx_published_articles \"\n            \"ON articles_article (created_at DESC) \"\n            \"WHERE is_published = true;\",\n            \n            reverse_sql=\"DROP INDEX idx_published_articles;\"\n        ),\n        \n        migrations.RunSQL(\n            # PostgreSQL: Create GIN index for full-text search\n            \"CREATE INDEX CONCURRENTLY idx_article_search \"\n            \"ON articles_article USING gin(to_tsvector('english', title || ' ' || content));\",\n            \n            reverse_sql=\"DROP INDEX idx_article_search;\"\n        ),\n    ]\n",[1050,5603,5604,5609,5624,5628,5646,5672,5697,5733,5765,5790,5815,5840,5844,5854,5859,5868,5895,5917,5939,5944,5948,5953,5961,5966,5996,6000,6005,6035,6039,6044,6074,6078,6082,6087,6106,6110,6129,6138,6160,6165,6170,6180,6193,6199,6210,6220,6232,6237,6252,6258,6263,6274,6280,6290,6302,6307,6321,6326],{"__ignoreMap":1048},[1053,5605,5606],{"class":1055,"line":1056},[1053,5607,5608],{"class":1059},"# models.py\n",[1053,5610,5611,5613,5615,5617,5619,5621],{"class":1055,"line":1063},[1053,5612,1252],{"class":1171},[1053,5614,1255],{"class":1066},[1053,5616,1077],{"class":1070},[1053,5618,1260],{"class":1066},[1053,5620,1263],{"class":1171},[1053,5622,5623],{"class":1066}," models\n",[1053,5625,5626],{"class":1055,"line":1093},[1053,5627,1159],{"emptyLinePlaceholder":1158},[1053,5629,5630,5632,5634,5636,5639,5641,5644],{"class":1055,"line":1125},[1053,5631,2109],{"class":1316},[1053,5633,1074],{"class":2112},[1053,5635,1109],{"class":1070},[1053,5637,5638],{"class":2118},"models",[1053,5640,1077],{"class":1070},[1053,5642,5643],{"class":2118},"Model",[1053,5645,1631],{"class":1070},[1053,5647,5648,5651,5653,5656,5658,5661,5663,5666,5668,5670],{"class":1055,"line":1155},[1053,5649,5650],{"class":1066},"    title ",[1053,5652,1071],{"class":1070},[1053,5654,5655],{"class":1066}," models",[1053,5657,1077],{"class":1070},[1053,5659,5660],{"class":1086},"CharField",[1053,5662,1109],{"class":1070},[1053,5664,5665],{"class":1112},"max_length",[1053,5667,1071],{"class":1070},[1053,5669,4972],{"class":1187},[1053,5671,1122],{"class":1070},[1053,5673,5674,5677,5679,5681,5683,5686,5688,5691,5693,5695],{"class":1055,"line":1162},[1053,5675,5676],{"class":1066},"    slug ",[1053,5678,1071],{"class":1070},[1053,5680,5655],{"class":1066},[1053,5682,1077],{"class":1070},[1053,5684,5685],{"class":1086},"SlugField",[1053,5687,1109],{"class":1070},[1053,5689,5690],{"class":1112},"unique",[1053,5692,1071],{"class":1070},[1053,5694,1119],{"class":1118},[1053,5696,1122],{"class":1070},[1053,5698,5699,5702,5704,5706,5708,5711,5713,5716,5718,5721,5723,5725,5727,5731],{"class":1055,"line":1168},[1053,5700,5701],{"class":1066},"    author ",[1053,5703,1071],{"class":1070},[1053,5705,5655],{"class":1066},[1053,5707,1077],{"class":1070},[1053,5709,5710],{"class":1086},"ForeignKey",[1053,5712,1109],{"class":1070},[1053,5714,5715],{"class":1086},"User",[1053,5717,1767],{"class":1070},[1053,5719,5720],{"class":1112}," on_delete",[1053,5722,1071],{"class":1070},[1053,5724,5638],{"class":1086},[1053,5726,1077],{"class":1070},[1053,5728,5730],{"class":5729},"sFGJz","CASCADE",[1053,5732,1122],{"class":1070},[1053,5734,5735,5738,5740,5742,5744,5746,5748,5751,5753,5755,5757,5759,5761,5763],{"class":1055,"line":1194},[1053,5736,5737],{"class":1066},"    category ",[1053,5739,1071],{"class":1070},[1053,5741,5655],{"class":1066},[1053,5743,1077],{"class":1070},[1053,5745,5710],{"class":1086},[1053,5747,1109],{"class":1070},[1053,5749,5750],{"class":1086},"Category",[1053,5752,1767],{"class":1070},[1053,5754,5720],{"class":1112},[1053,5756,1071],{"class":1070},[1053,5758,5638],{"class":1086},[1053,5760,1077],{"class":1070},[1053,5762,5730],{"class":5729},[1053,5764,1122],{"class":1070},[1053,5766,5767,5770,5772,5774,5776,5779,5781,5784,5786,5788],{"class":1055,"line":1213},[1053,5768,5769],{"class":1066},"    is_published ",[1053,5771,1071],{"class":1070},[1053,5773,5655],{"class":1066},[1053,5775,1077],{"class":1070},[1053,5777,5778],{"class":1086},"BooleanField",[1053,5780,1109],{"class":1070},[1053,5782,5783],{"class":1112},"default",[1053,5785,1071],{"class":1070},[1053,5787,4918],{"class":1118},[1053,5789,1122],{"class":1070},[1053,5791,5792,5795,5797,5799,5801,5804,5806,5809,5811,5813],{"class":1055,"line":1218},[1053,5793,5794],{"class":1066},"    created_at ",[1053,5796,1071],{"class":1070},[1053,5798,5655],{"class":1066},[1053,5800,1077],{"class":1070},[1053,5802,5803],{"class":1086},"DateTimeField",[1053,5805,1109],{"class":1070},[1053,5807,5808],{"class":1112},"auto_now_add",[1053,5810,1071],{"class":1070},[1053,5812,1119],{"class":1118},[1053,5814,1122],{"class":1070},[1053,5816,5817,5820,5822,5824,5826,5829,5831,5833,5835,5838],{"class":1055,"line":1224},[1053,5818,5819],{"class":1066},"    view_count ",[1053,5821,1071],{"class":1070},[1053,5823,5655],{"class":1066},[1053,5825,1077],{"class":1070},[1053,5827,5828],{"class":1086},"PositiveIntegerField",[1053,5830,1109],{"class":1070},[1053,5832,5783],{"class":1112},[1053,5834,1071],{"class":1070},[1053,5836,5837],{"class":1187},"0",[1053,5839,1122],{"class":1070},[1053,5841,5842],{"class":1055,"line":1412},[1053,5843,1350],{"class":1066},[1053,5845,5846,5849,5852],{"class":1055,"line":1461},[1053,5847,5848],{"class":1316},"    class",[1053,5850,5851],{"class":2112}," Meta",[1053,5853,1409],{"class":1070},[1053,5855,5856],{"class":1055,"line":1466},[1053,5857,5858],{"class":1059},"        # Single column indexes\n",[1053,5860,5861,5864,5866],{"class":1055,"line":1472},[1053,5862,5863],{"class":1066},"        indexes ",[1053,5865,1071],{"class":1070},[1053,5867,4795],{"class":1070},[1053,5869,5870,5873,5875,5878,5880,5883,5886,5888,5890,5892],{"class":1055,"line":1508},[1053,5871,5872],{"class":1066},"            models",[1053,5874,1077],{"class":1070},[1053,5876,5877],{"class":1086},"Index",[1053,5879,1109],{"class":1070},[1053,5881,5882],{"class":1112},"fields",[1053,5884,5885],{"class":1070},"=[",[1053,5887,1144],{"class":1143},[1053,5889,1113],{"class":1147},[1053,5891,1144],{"class":1143},[1053,5893,5894],{"class":1070},"]),\n",[1053,5896,5897,5899,5901,5903,5905,5907,5909,5911,5913,5915],{"class":1055,"line":1527},[1053,5898,5872],{"class":1066},[1053,5900,1077],{"class":1070},[1053,5902,5877],{"class":1086},[1053,5904,1109],{"class":1070},[1053,5906,5882],{"class":1112},[1053,5908,5885],{"class":1070},[1053,5910,1144],{"class":1143},[1053,5912,4315],{"class":1147},[1053,5914,1144],{"class":1143},[1053,5916,5894],{"class":1070},[1053,5918,5919,5921,5923,5925,5927,5929,5931,5933,5935,5937],{"class":1055,"line":1563},[1053,5920,5872],{"class":1066},[1053,5922,1077],{"class":1070},[1053,5924,5877],{"class":1086},[1053,5926,1109],{"class":1070},[1053,5928,5882],{"class":1112},[1053,5930,5885],{"class":1070},[1053,5932,1144],{"class":1143},[1053,5934,4586],{"class":1147},[1053,5936,1144],{"class":1143},[1053,5938,5894],{"class":1070},[1053,5940,5941],{"class":1055,"line":1860},[1053,5942,5943],{"class":1070},"        ]\n",[1053,5945,5946],{"class":1055,"line":1871},[1053,5947,2406],{"class":1066},[1053,5949,5950],{"class":1055,"line":1880},[1053,5951,5952],{"class":1059},"        # Composite indexes for common query patterns\n",[1053,5954,5955,5957,5959],{"class":1055,"line":1896},[1053,5956,5863],{"class":1066},[1053,5958,1071],{"class":1070},[1053,5960,4795],{"class":1070},[1053,5962,5963],{"class":1055,"line":1901},[1053,5964,5965],{"class":1059},"            # For queries filtering by published status and ordering by date\n",[1053,5967,5968,5970,5972,5974,5976,5978,5980,5982,5984,5986,5988,5990,5992,5994],{"class":1055,"line":1914},[1053,5969,5872],{"class":1066},[1053,5971,1077],{"class":1070},[1053,5973,5877],{"class":1086},[1053,5975,1109],{"class":1070},[1053,5977,5882],{"class":1112},[1053,5979,5885],{"class":1070},[1053,5981,1144],{"class":1143},[1053,5983,1113],{"class":1147},[1053,5985,1144],{"class":1143},[1053,5987,1767],{"class":1070},[1053,5989,1770],{"class":1143},[1053,5991,1148],{"class":1147},[1053,5993,1144],{"class":1143},[1053,5995,5894],{"class":1070},[1053,5997,5998],{"class":1055,"line":1936},[1053,5999,2251],{"class":1066},[1053,6001,6002],{"class":1055,"line":1958},[1053,6003,6004],{"class":1059},"            # For queries filtering by category and published status\n",[1053,6006,6007,6009,6011,6013,6015,6017,6019,6021,6023,6025,6027,6029,6031,6033],{"class":1055,"line":1980},[1053,6008,5872],{"class":1066},[1053,6010,1077],{"class":1070},[1053,6012,5877],{"class":1086},[1053,6014,1109],{"class":1070},[1053,6016,5882],{"class":1112},[1053,6018,5885],{"class":1070},[1053,6020,1144],{"class":1143},[1053,6022,1711],{"class":1147},[1053,6024,1144],{"class":1143},[1053,6026,1767],{"class":1070},[1053,6028,1770],{"class":1143},[1053,6030,1113],{"class":1147},[1053,6032,1144],{"class":1143},[1053,6034,5894],{"class":1070},[1053,6036,6037],{"class":1055,"line":1985},[1053,6038,2251],{"class":1066},[1053,6040,6041],{"class":1055,"line":2417},[1053,6042,6043],{"class":1059},"            # For full-text search (PostgreSQL)\n",[1053,6045,6046,6048,6050,6052,6054,6056,6058,6060,6062,6064,6066,6068,6070,6072],{"class":1055,"line":2422},[1053,6047,5872],{"class":1066},[1053,6049,1077],{"class":1070},[1053,6051,5877],{"class":1086},[1053,6053,1109],{"class":1070},[1053,6055,5882],{"class":1112},[1053,6057,5885],{"class":1070},[1053,6059,1144],{"class":1143},[1053,6061,1208],{"class":1147},[1053,6063,1144],{"class":1143},[1053,6065,1767],{"class":1070},[1053,6067,1770],{"class":1143},[1053,6069,3975],{"class":1147},[1053,6071,1144],{"class":1143},[1053,6073,5894],{"class":1070},[1053,6075,6076],{"class":1055,"line":2441},[1053,6077,5943],{"class":1070},[1053,6079,6080],{"class":1055,"line":2455},[1053,6081,1159],{"emptyLinePlaceholder":1158},[1053,6083,6084],{"class":1055,"line":2466},[1053,6085,6086],{"class":1059},"# Migration for adding indexes\n",[1053,6088,6089,6091,6093,6095,6097,6099,6102,6104],{"class":1055,"line":2480},[1053,6090,1252],{"class":1171},[1053,6092,1255],{"class":1066},[1053,6094,1077],{"class":1070},[1053,6096,1260],{"class":1066},[1053,6098,1263],{"class":1171},[1053,6100,6101],{"class":1066}," migrations",[1053,6103,1767],{"class":1070},[1053,6105,5623],{"class":1066},[1053,6107,6108],{"class":1055,"line":2486},[1053,6109,1159],{"emptyLinePlaceholder":1158},[1053,6111,6112,6114,6117,6119,6122,6124,6127],{"class":1055,"line":2544},[1053,6113,2109],{"class":1316},[1053,6115,6116],{"class":2112}," Migration",[1053,6118,1109],{"class":1070},[1053,6120,6121],{"class":2118},"migrations",[1053,6123,1077],{"class":1070},[1053,6125,6126],{"class":2118},"Migration",[1053,6128,1631],{"class":1070},[1053,6130,6131,6134,6136],{"class":1055,"line":2584},[1053,6132,6133],{"class":1066},"    dependencies ",[1053,6135,1071],{"class":1070},[1053,6137,4795],{"class":1070},[1053,6139,6140,6143,6145,6147,6149,6151,6153,6156,6158],{"class":1055,"line":2589},[1053,6141,6142],{"class":1070},"        (",[1053,6144,1144],{"class":1143},[1053,6146,1785],{"class":1147},[1053,6148,1144],{"class":1143},[1053,6150,1767],{"class":1070},[1053,6152,1770],{"class":1143},[1053,6154,6155],{"class":1147},"0001_initial",[1053,6157,1144],{"class":1143},[1053,6159,3871],{"class":1070},[1053,6161,6162],{"class":1055,"line":2595},[1053,6163,6164],{"class":1070},"    ]\n",[1053,6166,6168],{"class":1055,"line":6167},40,[1053,6169,1350],{"class":1066},[1053,6171,6173,6176,6178],{"class":1055,"line":6172},41,[1053,6174,6175],{"class":1066},"    operations ",[1053,6177,1071],{"class":1070},[1053,6179,4795],{"class":1070},[1053,6181,6183,6186,6188,6191],{"class":1055,"line":6182},42,[1053,6184,6185],{"class":1066},"        migrations",[1053,6187,1077],{"class":1070},[1053,6189,6190],{"class":1086},"RunSQL",[1053,6192,1836],{"class":1070},[1053,6194,6196],{"class":1055,"line":6195},43,[1053,6197,6198],{"class":1059},"            # PostgreSQL: Create partial index\n",[1053,6200,6202,6205,6208],{"class":1055,"line":6201},44,[1053,6203,6204],{"class":1143},"            \"",[1053,6206,6207],{"class":1147},"CREATE INDEX CONCURRENTLY idx_published_articles ",[1053,6209,3258],{"class":1143},[1053,6211,6213,6215,6218],{"class":1055,"line":6212},45,[1053,6214,6204],{"class":1143},[1053,6216,6217],{"class":1147},"ON articles_article (created_at DESC) ",[1053,6219,3258],{"class":1143},[1053,6221,6223,6225,6228,6230],{"class":1055,"line":6222},46,[1053,6224,6204],{"class":1143},[1053,6226,6227],{"class":1147},"WHERE is_published = true;",[1053,6229,1423],{"class":1143},[1053,6231,1848],{"class":1070},[1053,6233,6235],{"class":1055,"line":6234},47,[1053,6236,2251],{"class":1086},[1053,6238,6240,6243,6245,6247,6250],{"class":1055,"line":6239},48,[1053,6241,6242],{"class":1112},"            reverse_sql",[1053,6244,1071],{"class":1070},[1053,6246,1423],{"class":1143},[1053,6248,6249],{"class":1147},"DROP INDEX idx_published_articles;",[1053,6251,3258],{"class":1143},[1053,6253,6255],{"class":1055,"line":6254},49,[1053,6256,6257],{"class":1070},"        ),\n",[1053,6259,6261],{"class":1055,"line":6260},50,[1053,6262,2406],{"class":1066},[1053,6264,6266,6268,6270,6272],{"class":1055,"line":6265},51,[1053,6267,6185],{"class":1066},[1053,6269,1077],{"class":1070},[1053,6271,6190],{"class":1086},[1053,6273,1836],{"class":1070},[1053,6275,6277],{"class":1055,"line":6276},52,[1053,6278,6279],{"class":1059},"            # PostgreSQL: Create GIN index for full-text search\n",[1053,6281,6283,6285,6288],{"class":1055,"line":6282},53,[1053,6284,6204],{"class":1143},[1053,6286,6287],{"class":1147},"CREATE INDEX CONCURRENTLY idx_article_search ",[1053,6289,3258],{"class":1143},[1053,6291,6293,6295,6298,6300],{"class":1055,"line":6292},54,[1053,6294,6204],{"class":1143},[1053,6296,6297],{"class":1147},"ON articles_article USING gin(to_tsvector('english', title || ' ' || content));",[1053,6299,1423],{"class":1143},[1053,6301,1848],{"class":1070},[1053,6303,6305],{"class":1055,"line":6304},55,[1053,6306,2251],{"class":1086},[1053,6308,6310,6312,6314,6316,6319],{"class":1055,"line":6309},56,[1053,6311,6242],{"class":1112},[1053,6313,1071],{"class":1070},[1053,6315,1423],{"class":1143},[1053,6317,6318],{"class":1147},"DROP INDEX idx_article_search;",[1053,6320,3258],{"class":1143},[1053,6322,6324],{"class":1055,"line":6323},57,[1053,6325,6257],{"class":1070},[1053,6327,6329],{"class":1055,"line":6328},58,[1053,6330,6164],{"class":1070},[1035,6332,6334],{"id":6333},"index-usage-analysis","Index Usage Analysis",[1043,6336,6338],{"className":1045,"code":6337,"language":1047,"meta":1048,"style":1048},"# Analyze index usage (PostgreSQL)\ndef analyze_index_usage():\n    with connection.cursor() as cursor:\n        cursor.execute(\"\"\"\n            SELECT \n                schemaname,\n                tablename,\n                indexname,\n                idx_tup_read,\n                idx_tup_fetch,\n                idx_scan\n            FROM pg_stat_user_indexes\n            WHERE schemaname = 'public'\n            ORDER BY idx_scan DESC\n        \"\"\")\n        \n        indexes = cursor.fetchall()\n        \n        print(\"Index Usage Statistics:\")\n        for schema, table, index, tup_read, tup_fetch, scans in indexes:\n            print(f\"{table}.{index}: {scans} scans, {tup_read} tuples read\")\n",[1050,6339,6340,6345,6354,6373,6386,6391,6396,6401,6406,6411,6416,6421,6426,6431,6436,6442,6446,6460,6464,6479,6518],{"__ignoreMap":1048},[1053,6341,6342],{"class":1055,"line":1056},[1053,6343,6344],{"class":1059},"# Analyze index usage (PostgreSQL)\n",[1053,6346,6347,6349,6352],{"class":1055,"line":1063},[1053,6348,1317],{"class":1316},[1053,6350,6351],{"class":1299}," analyze_index_usage",[1053,6353,1323],{"class":1070},[1053,6355,6356,6359,6361,6363,6365,6367,6369,6371],{"class":1055,"line":1093},[1053,6357,6358],{"class":1171},"    with",[1053,6360,1518],{"class":1066},[1053,6362,1077],{"class":1070},[1053,6364,5358],{"class":1086},[1053,6366,2628],{"class":1070},[1053,6368,5363],{"class":1171},[1053,6370,5366],{"class":1066},[1053,6372,1409],{"class":1070},[1053,6374,6375,6378,6380,6382,6384],{"class":1055,"line":1125},[1053,6376,6377],{"class":1066},"        cursor",[1053,6379,1077],{"class":1070},[1053,6381,5383],{"class":1086},[1053,6383,1109],{"class":1070},[1053,6385,2452],{"class":1143},[1053,6387,6388],{"class":1055,"line":1155},[1053,6389,6390],{"class":1147},"            SELECT \n",[1053,6392,6393],{"class":1055,"line":1162},[1053,6394,6395],{"class":1147},"                schemaname,\n",[1053,6397,6398],{"class":1055,"line":1168},[1053,6399,6400],{"class":1147},"                tablename,\n",[1053,6402,6403],{"class":1055,"line":1194},[1053,6404,6405],{"class":1147},"                indexname,\n",[1053,6407,6408],{"class":1055,"line":1213},[1053,6409,6410],{"class":1147},"                idx_tup_read,\n",[1053,6412,6413],{"class":1055,"line":1218},[1053,6414,6415],{"class":1147},"                idx_tup_fetch,\n",[1053,6417,6418],{"class":1055,"line":1224},[1053,6419,6420],{"class":1147},"                idx_scan\n",[1053,6422,6423],{"class":1055,"line":1412},[1053,6424,6425],{"class":1147},"            FROM pg_stat_user_indexes\n",[1053,6427,6428],{"class":1055,"line":1461},[1053,6429,6430],{"class":1147},"            WHERE schemaname = 'public'\n",[1053,6432,6433],{"class":1055,"line":1466},[1053,6434,6435],{"class":1147},"            ORDER BY idx_scan DESC\n",[1053,6437,6438,6440],{"class":1055,"line":1472},[1053,6439,2445],{"class":1143},[1053,6441,1122],{"class":1070},[1053,6443,6444],{"class":1055,"line":1508},[1053,6445,2406],{"class":1066},[1053,6447,6448,6450,6452,6454,6456,6458],{"class":1055,"line":1527},[1053,6449,5863],{"class":1066},[1053,6451,1071],{"class":1070},[1053,6453,5366],{"class":1066},[1053,6455,1077],{"class":1070},[1053,6457,5437],{"class":1086},[1053,6459,1090],{"class":1070},[1053,6461,6462],{"class":1055,"line":1563},[1053,6463,2406],{"class":1066},[1053,6465,6466,6468,6470,6472,6475,6477],{"class":1055,"line":1860},[1053,6467,1415],{"class":1197},[1053,6469,1109],{"class":1070},[1053,6471,1423],{"class":1143},[1053,6473,6474],{"class":1147},"Index Usage Statistics:",[1053,6476,1423],{"class":1143},[1053,6478,1122],{"class":1070},[1053,6480,6481,6483,6486,6488,6491,6493,6496,6498,6501,6503,6506,6508,6511,6513,6516],{"class":1055,"line":1871},[1053,6482,2469],{"class":1171},[1053,6484,6485],{"class":1066}," schema",[1053,6487,1767],{"class":1070},[1053,6489,6490],{"class":1066}," table",[1053,6492,1767],{"class":1070},[1053,6494,6495],{"class":1066}," index",[1053,6497,1767],{"class":1070},[1053,6499,6500],{"class":1066}," tup_read",[1053,6502,1767],{"class":1070},[1053,6504,6505],{"class":1066}," tup_fetch",[1053,6507,1767],{"class":1070},[1053,6509,6510],{"class":1066}," scans ",[1053,6512,1178],{"class":1171},[1053,6514,6515],{"class":1066}," indexes",[1053,6517,1409],{"class":1070},[1053,6519,6520,6523,6525,6527,6529,6531,6534,6536,6538,6540,6543,6545,6547,6549,6552,6554,6557,6559,6562,6564,6567],{"class":1055,"line":1880},[1053,6521,6522],{"class":1197},"            print",[1053,6524,1109],{"class":1070},[1053,6526,1420],{"class":1316},[1053,6528,1423],{"class":1147},[1053,6530,1427],{"class":1426},[1053,6532,6533],{"class":1086},"table",[1053,6535,1436],{"class":1426},[1053,6537,1077],{"class":1147},[1053,6539,1427],{"class":1426},[1053,6541,6542],{"class":1086},"index",[1053,6544,1436],{"class":1426},[1053,6546,3966],{"class":1147},[1053,6548,1427],{"class":1426},[1053,6550,6551],{"class":1086},"scans",[1053,6553,1436],{"class":1426},[1053,6555,6556],{"class":1147}," scans, ",[1053,6558,1427],{"class":1426},[1053,6560,6561],{"class":1086},"tup_read",[1053,6563,1436],{"class":1426},[1053,6565,6566],{"class":1147}," tuples read\"",[1053,6568,1122],{"class":1070},[1030,6570,6572],{"id":6571},"query-performance-monitoring","Query Performance Monitoring",[1035,6574,6576],{"id":6575},"custom-query-profiler","Custom Query Profiler",[1043,6578,6580],{"className":1045,"code":6579,"language":1047,"meta":1048,"style":1048},"import time\nimport logging\nfrom django.db import connection\nfrom contextlib import contextmanager\n\nlogger = logging.getLogger(__name__)\n\n@contextmanager\ndef query_profiler(description=\"Query block\"):\n    \"\"\"Context manager to profile database queries\"\"\"\n    initial_queries = len(connection.queries)\n    start_time = time.time()\n    \n    yield\n    \n    end_time = time.time()\n    num_queries = len(connection.queries) - initial_queries\n    duration = end_time - start_time\n    \n    logger.info(\n        f\"{description}: {num_queries} queries in {duration:.4f}s\"\n    )\n    \n    # Log slow queries\n    if duration > 0.5:\n        recent_queries = connection.queries[initial_queries:]\n        for query in recent_queries:\n            if float(query['time']) > 0.1:\n                logger.warning(f\"Slow query ({query['time']}s): {query['sql'][:200]}...\")\n\n# Usage\ndef expensive_view(request):\n    with query_profiler(\"Article list with comments\"):\n        articles = Article.objects.select_related('author').prefetch_related(\n            'comments__author'\n        ).all()[:20]\n        \n        return render(request, 'articles.html', {'articles': articles})\n",[1050,6581,6582,6588,6594,6608,6620,6624,6642,6646,6653,6676,6686,6705,6720,6724,6729,6733,6748,6772,6787,6791,6803,6839,6843,6847,6852,6866,6885,6898,6928,6988,6992,6997,7010,7027,7057,7066,7079,7083],{"__ignoreMap":1048},[1053,6583,6584,6586],{"class":1055,"line":1056},[1053,6585,1263],{"class":1171},[1053,6587,3083],{"class":1066},[1053,6589,6590,6592],{"class":1055,"line":1063},[1053,6591,1263],{"class":1171},[1053,6593,2038],{"class":1066},[1053,6595,6596,6598,6600,6602,6604,6606],{"class":1055,"line":1093},[1053,6597,1252],{"class":1171},[1053,6599,1255],{"class":1066},[1053,6601,1077],{"class":1070},[1053,6603,1260],{"class":1066},[1053,6605,1263],{"class":1171},[1053,6607,1266],{"class":1066},[1053,6609,6610,6612,6615,6617],{"class":1055,"line":1125},[1053,6611,1252],{"class":1171},[1053,6613,6614],{"class":1066}," contextlib ",[1053,6616,1263],{"class":1171},[1053,6618,6619],{"class":1066}," contextmanager\n",[1053,6621,6622],{"class":1055,"line":1155},[1053,6623,1159],{"emptyLinePlaceholder":1158},[1053,6625,6626,6628,6630,6632,6634,6636,6638,6640],{"class":1055,"line":1162},[1053,6627,2082],{"class":1066},[1053,6629,1071],{"class":1070},[1053,6631,2087],{"class":1066},[1053,6633,1077],{"class":1070},[1053,6635,2092],{"class":1086},[1053,6637,1109],{"class":1070},[1053,6639,2098],{"class":2097},[1053,6641,1122],{"class":1070},[1053,6643,6644],{"class":1055,"line":1168},[1053,6645,1159],{"emptyLinePlaceholder":1158},[1053,6647,6648,6650],{"class":1055,"line":1194},[1053,6649,1296],{"class":1070},[1053,6651,6652],{"class":1299},"contextmanager\n",[1053,6654,6655,6657,6660,6662,6665,6667,6669,6672,6674],{"class":1055,"line":1213},[1053,6656,1317],{"class":1316},[1053,6658,6659],{"class":1299}," query_profiler",[1053,6661,1109],{"class":1070},[1053,6663,6664],{"class":1627},"description",[1053,6666,1071],{"class":2238},[1053,6668,1423],{"class":1143},[1053,6670,6671],{"class":1147},"Query block",[1053,6673,1423],{"class":1143},[1053,6675,1631],{"class":1070},[1053,6677,6678,6681,6684],{"class":1055,"line":1218},[1053,6679,6680],{"class":2444},"    \"\"\"",[1053,6682,6683],{"class":2448},"Context manager to profile database queries",[1053,6685,2452],{"class":2444},[1053,6687,6688,6691,6693,6695,6697,6699,6701,6703],{"class":1055,"line":1224},[1053,6689,6690],{"class":1066},"    initial_queries ",[1053,6692,1071],{"class":1070},[1053,6694,2158],{"class":1197},[1053,6696,1109],{"class":1070},[1053,6698,1491],{"class":1086},[1053,6700,1077],{"class":1070},[1053,6702,1496],{"class":1080},[1053,6704,1122],{"class":1070},[1053,6706,6707,6710,6712,6714,6716,6718],{"class":1055,"line":1412},[1053,6708,6709],{"class":1066},"    start_time ",[1053,6711,1071],{"class":1070},[1053,6713,3290],{"class":1066},[1053,6715,1077],{"class":1070},[1053,6717,1583],{"class":1086},[1053,6719,1090],{"class":1070},[1053,6721,6722],{"class":1055,"line":1461},[1053,6723,1350],{"class":1066},[1053,6725,6726],{"class":1055,"line":1466},[1053,6727,6728],{"class":1171},"    yield\n",[1053,6730,6731],{"class":1055,"line":1472},[1053,6732,1350],{"class":1066},[1053,6734,6735,6738,6740,6742,6744,6746],{"class":1055,"line":1508},[1053,6736,6737],{"class":1066},"    end_time ",[1053,6739,1071],{"class":1070},[1053,6741,3290],{"class":1066},[1053,6743,1077],{"class":1070},[1053,6745,1583],{"class":1086},[1053,6747,1090],{"class":1070},[1053,6749,6750,6753,6755,6757,6759,6761,6763,6765,6767,6769],{"class":1055,"line":1527},[1053,6751,6752],{"class":1066},"    num_queries ",[1053,6754,1071],{"class":1070},[1053,6756,2158],{"class":1197},[1053,6758,1109],{"class":1070},[1053,6760,1491],{"class":1086},[1053,6762,1077],{"class":1070},[1053,6764,1496],{"class":1080},[1053,6766,1499],{"class":1070},[1053,6768,2239],{"class":2238},[1053,6770,6771],{"class":1066}," initial_queries\n",[1053,6773,6774,6777,6779,6782,6784],{"class":1055,"line":1563},[1053,6775,6776],{"class":1066},"    duration ",[1053,6778,1071],{"class":1070},[1053,6780,6781],{"class":1066}," end_time ",[1053,6783,3388],{"class":2238},[1053,6785,6786],{"class":1066}," start_time\n",[1053,6788,6789],{"class":1055,"line":1860},[1053,6790,1350],{"class":1066},[1053,6792,6793,6796,6798,6801],{"class":1055,"line":1871},[1053,6794,6795],{"class":1066},"    logger",[1053,6797,1077],{"class":1070},[1053,6799,6800],{"class":1086},"info",[1053,6802,1836],{"class":1070},[1053,6804,6805,6808,6810,6812,6814,6816,6818,6820,6822,6824,6827,6829,6832,6834,6836],{"class":1055,"line":1880},[1053,6806,6807],{"class":1316},"        f",[1053,6809,1423],{"class":1147},[1053,6811,1427],{"class":1426},[1053,6813,6664],{"class":1086},[1053,6815,1436],{"class":1426},[1053,6817,3966],{"class":1147},[1053,6819,1427],{"class":1426},[1053,6821,2375],{"class":1086},[1053,6823,1436],{"class":1426},[1053,6825,6826],{"class":1147}," queries in ",[1053,6828,1427],{"class":1426},[1053,6830,6831],{"class":1086},"duration",[1053,6833,3394],{"class":1316},[1053,6835,1436],{"class":1426},[1053,6837,6838],{"class":1147},"s\"\n",[1053,6840,6841],{"class":1055,"line":1896},[1053,6842,3890],{"class":1070},[1053,6844,6845],{"class":1055,"line":1901},[1053,6846,1350],{"class":1066},[1053,6848,6849],{"class":1055,"line":1914},[1053,6850,6851],{"class":1059},"    # Log slow queries\n",[1053,6853,6854,6856,6859,6861,6864],{"class":1055,"line":1936},[1053,6855,2968],{"class":1171},[1053,6857,6858],{"class":1066}," duration ",[1053,6860,2267],{"class":2238},[1053,6862,6863],{"class":1187}," 0.5",[1053,6865,1409],{"class":1070},[1053,6867,6868,6871,6873,6875,6877,6879,6881,6883],{"class":1055,"line":1958},[1053,6869,6870],{"class":1066},"        recent_queries ",[1053,6872,1071],{"class":1070},[1053,6874,1518],{"class":1066},[1053,6876,1077],{"class":1070},[1053,6878,1496],{"class":1080},[1053,6880,1544],{"class":1070},[1053,6882,2152],{"class":1080},[1053,6884,2310],{"class":1070},[1053,6886,6887,6889,6891,6893,6896],{"class":1055,"line":1980},[1053,6888,2469],{"class":1171},[1053,6890,1513],{"class":1066},[1053,6892,1178],{"class":1171},[1053,6894,6895],{"class":1066}," recent_queries",[1053,6897,1409],{"class":1070},[1053,6899,6900,6902,6905,6907,6909,6911,6913,6915,6917,6920,6923,6926],{"class":1055,"line":1985},[1053,6901,2261],{"class":1171},[1053,6903,6904],{"class":3662}," float",[1053,6906,1109],{"class":1070},[1053,6908,1541],{"class":1086},[1053,6910,1544],{"class":1070},[1053,6912,1144],{"class":1143},[1053,6914,1583],{"class":1147},[1053,6916,1144],{"class":1143},[1053,6918,6919],{"class":1070},"])",[1053,6921,6922],{"class":2238}," >",[1053,6924,6925],{"class":1187}," 0.1",[1053,6927,1409],{"class":1070},[1053,6929,6930,6933,6935,6937,6939,6941,6944,6946,6948,6950,6952,6954,6956,6958,6960,6963,6965,6967,6969,6971,6973,6975,6978,6980,6982,6984,6986],{"class":1055,"line":2417},[1053,6931,6932],{"class":1066},"                logger",[1053,6934,1077],{"class":1070},[1053,6936,2340],{"class":1086},[1053,6938,1109],{"class":1070},[1053,6940,1420],{"class":1316},[1053,6942,6943],{"class":1147},"\"Slow query (",[1053,6945,1427],{"class":1426},[1053,6947,1541],{"class":1086},[1053,6949,1544],{"class":1070},[1053,6951,1144],{"class":1143},[1053,6953,1583],{"class":1147},[1053,6955,1144],{"class":1143},[1053,6957,1554],{"class":1070},[1053,6959,1436],{"class":1426},[1053,6961,6962],{"class":1147},"s): ",[1053,6964,1427],{"class":1426},[1053,6966,1541],{"class":1086},[1053,6968,1544],{"class":1070},[1053,6970,1144],{"class":1143},[1053,6972,1549],{"class":1147},[1053,6974,1144],{"class":1143},[1053,6976,6977],{"class":1070},"][:",[1053,6979,4972],{"class":1187},[1053,6981,1554],{"class":1070},[1053,6983,1436],{"class":1426},[1053,6985,5508],{"class":1147},[1053,6987,1122],{"class":1070},[1053,6989,6990],{"class":1055,"line":2422},[1053,6991,1159],{"emptyLinePlaceholder":1158},[1053,6993,6994],{"class":1055,"line":2441},[1053,6995,6996],{"class":1059},"# Usage\n",[1053,6998,6999,7001,7004,7006,7008],{"class":1055,"line":2455},[1053,7000,1317],{"class":1316},[1053,7002,7003],{"class":1299}," expensive_view",[1053,7005,1109],{"class":1070},[1053,7007,1628],{"class":1627},[1053,7009,1631],{"class":1070},[1053,7011,7012,7014,7016,7018,7020,7023,7025],{"class":1055,"line":2466},[1053,7013,6358],{"class":1171},[1053,7015,6659],{"class":1086},[1053,7017,1109],{"class":1070},[1053,7019,1423],{"class":1143},[1053,7021,7022],{"class":1147},"Article list with comments",[1053,7024,1423],{"class":1143},[1053,7026,1631],{"class":1070},[1053,7028,7029,7031,7033,7035,7037,7039,7041,7043,7045,7047,7049,7051,7053,7055],{"class":1055,"line":2480},[1053,7030,3305],{"class":1066},[1053,7032,1071],{"class":1070},[1053,7034,1074],{"class":1066},[1053,7036,1077],{"class":1070},[1053,7038,1081],{"class":1080},[1053,7040,1077],{"class":1070},[1053,7042,1373],{"class":1086},[1053,7044,1109],{"class":1070},[1053,7046,1144],{"class":1143},[1053,7048,1380],{"class":1147},[1053,7050,1144],{"class":1143},[1053,7052,1385],{"class":1070},[1053,7054,1866],{"class":1086},[1053,7056,1836],{"class":1070},[1053,7058,7059,7062,7064],{"class":1055,"line":2486},[1053,7060,7061],{"class":1143},"            '",[1053,7063,4030],{"class":1147},[1053,7065,1857],{"class":1143},[1053,7067,7068,7070,7072,7074,7077],{"class":1055,"line":2544},[1053,7069,4229],{"class":1070},[1053,7071,1087],{"class":1086},[1053,7073,1390],{"class":1070},[1053,7075,7076],{"class":1187},"20",[1053,7078,1395],{"class":1070},[1053,7080,7081],{"class":1055,"line":2584},[1053,7082,2406],{"class":1066},[1053,7084,7085,7087,7089,7091,7093,7095,7097,7100,7102,7104,7106,7108,7110,7112,7114,7116],{"class":1055,"line":2589},[1053,7086,2411],{"class":1171},[1053,7088,1760],{"class":1086},[1053,7090,1109],{"class":1070},[1053,7092,1628],{"class":1086},[1053,7094,1767],{"class":1070},[1053,7096,1770],{"class":1143},[1053,7098,7099],{"class":1147},"articles.html",[1053,7101,1144],{"class":1143},[1053,7103,1767],{"class":1070},[1053,7105,1780],{"class":1070},[1053,7107,1144],{"class":1143},[1053,7109,1785],{"class":1147},[1053,7111,1144],{"class":1143},[1053,7113,1790],{"class":1070},[1053,7115,1101],{"class":1086},[1053,7117,1795],{"class":1070},[1035,7119,7121],{"id":7120},"query-optimization-decorator","Query Optimization Decorator",[1043,7123,7125],{"className":1045,"code":7124,"language":1047,"meta":1048,"style":1048},"from functools import wraps\n\ndef optimize_queries(max_queries=10):\n    \"\"\"Decorator to ensure views don't exceed query limits\"\"\"\n    def decorator(view_func):\n        @wraps(view_func)\n        def wrapper(request, *args, **kwargs):\n            initial_queries = len(connection.queries)\n            \n            response = view_func(request, *args, **kwargs)\n            \n            num_queries = len(connection.queries) - initial_queries\n            \n            if num_queries > max_queries:\n                logger.warning(\n                    f\"View {view_func.__name__} executed {num_queries} queries \"\n                    f\"(limit: {max_queries})\"\n                )\n            \n            return response\n        \n        return wrapper\n    return decorator\n\n# Usage\n@optimize_queries(max_queries=5)\ndef article_list(request):\n    articles = Article.objects.select_related('author').all()[:20]\n    return render(request, 'articles.html', {'articles': articles})\n",[1050,7126,7127,7139,7143,7161,7170,7184,7198,7225,7244,7248,7276,7280,7302,7306,7319,7329,7359,7375,7379,7383,7390,7394,7401,7408,7412,7416,7434,7447,7481],{"__ignoreMap":1048},[1053,7128,7129,7131,7134,7136],{"class":1055,"line":1056},[1053,7130,1252],{"class":1171},[1053,7132,7133],{"class":1066}," functools ",[1053,7135,1263],{"class":1171},[1053,7137,7138],{"class":1066}," wraps\n",[1053,7140,7141],{"class":1055,"line":1063},[1053,7142,1159],{"emptyLinePlaceholder":1158},[1053,7144,7145,7147,7150,7152,7155,7157,7159],{"class":1055,"line":1093},[1053,7146,1317],{"class":1316},[1053,7148,7149],{"class":1299}," optimize_queries",[1053,7151,1109],{"class":1070},[1053,7153,7154],{"class":1627},"max_queries",[1053,7156,1071],{"class":2238},[1053,7158,1188],{"class":1187},[1053,7160,1631],{"class":1070},[1053,7162,7163,7165,7168],{"class":1055,"line":1125},[1053,7164,6680],{"class":2444},[1053,7166,7167],{"class":2448},"Decorator to ensure views don't exceed query limits",[1053,7169,2452],{"class":2444},[1053,7171,7172,7174,7177,7179,7182],{"class":1055,"line":1155},[1053,7173,2126],{"class":1316},[1053,7175,7176],{"class":1299}," decorator",[1053,7178,1109],{"class":1070},[1053,7180,7181],{"class":1627},"view_func",[1053,7183,1631],{"class":1070},[1053,7185,7186,7189,7192,7194,7196],{"class":1055,"line":1162},[1053,7187,7188],{"class":1070},"        @",[1053,7190,7191],{"class":1299},"wraps",[1053,7193,1109],{"class":1070},[1053,7195,7181],{"class":1086},[1053,7197,1122],{"class":1070},[1053,7199,7200,7203,7206,7208,7210,7212,7214,7216,7218,7220,7223],{"class":1055,"line":1168},[1053,7201,7202],{"class":1316},"        def",[1053,7204,7205],{"class":1299}," wrapper",[1053,7207,1109],{"class":1070},[1053,7209,1628],{"class":1627},[1053,7211,1767],{"class":1070},[1053,7213,4765],{"class":2238},[1053,7215,5336],{"class":1627},[1053,7217,1767],{"class":1070},[1053,7219,5341],{"class":2238},[1053,7221,7222],{"class":1627},"kwargs",[1053,7224,1631],{"class":1070},[1053,7226,7227,7230,7232,7234,7236,7238,7240,7242],{"class":1055,"line":1194},[1053,7228,7229],{"class":1066},"            initial_queries ",[1053,7231,1071],{"class":1070},[1053,7233,2158],{"class":1197},[1053,7235,1109],{"class":1070},[1053,7237,1491],{"class":1086},[1053,7239,1077],{"class":1070},[1053,7241,1496],{"class":1080},[1053,7243,1122],{"class":1070},[1053,7245,7246],{"class":1055,"line":1213},[1053,7247,2251],{"class":1066},[1053,7249,7250,7253,7255,7258,7260,7262,7264,7266,7268,7270,7272,7274],{"class":1055,"line":1218},[1053,7251,7252],{"class":1066},"            response ",[1053,7254,1071],{"class":1070},[1053,7256,7257],{"class":1086}," view_func",[1053,7259,1109],{"class":1070},[1053,7261,1628],{"class":1086},[1053,7263,1767],{"class":1070},[1053,7265,4765],{"class":2238},[1053,7267,5336],{"class":1086},[1053,7269,1767],{"class":1070},[1053,7271,5341],{"class":2238},[1053,7273,7222],{"class":1086},[1053,7275,1122],{"class":1070},[1053,7277,7278],{"class":1055,"line":1224},[1053,7279,2251],{"class":1066},[1053,7281,7282,7284,7286,7288,7290,7292,7294,7296,7298,7300],{"class":1055,"line":1412},[1053,7283,2221],{"class":1066},[1053,7285,1071],{"class":1070},[1053,7287,2158],{"class":1197},[1053,7289,1109],{"class":1070},[1053,7291,1491],{"class":1086},[1053,7293,1077],{"class":1070},[1053,7295,1496],{"class":1080},[1053,7297,1499],{"class":1070},[1053,7299,2239],{"class":2238},[1053,7301,6771],{"class":1066},[1053,7303,7304],{"class":1055,"line":1461},[1053,7305,2251],{"class":1066},[1053,7307,7308,7310,7312,7314,7317],{"class":1055,"line":1466},[1053,7309,2261],{"class":1171},[1053,7311,2264],{"class":1066},[1053,7313,2267],{"class":2238},[1053,7315,7316],{"class":1066}," max_queries",[1053,7318,1409],{"class":1070},[1053,7320,7321,7323,7325,7327],{"class":1055,"line":1472},[1053,7322,6932],{"class":1066},[1053,7324,1077],{"class":1070},[1053,7326,2340],{"class":1086},[1053,7328,1836],{"class":1070},[1053,7330,7331,7334,7337,7339,7341,7343,7345,7347,7350,7352,7354,7356],{"class":1055,"line":1508},[1053,7332,7333],{"class":1316},"                    f",[1053,7335,7336],{"class":1147},"\"View ",[1053,7338,1427],{"class":1426},[1053,7340,7181],{"class":1086},[1053,7342,1077],{"class":1070},[1053,7344,2098],{"class":2097},[1053,7346,1436],{"class":1426},[1053,7348,7349],{"class":1147}," executed ",[1053,7351,1427],{"class":1426},[1053,7353,2375],{"class":1086},[1053,7355,1436],{"class":1426},[1053,7357,7358],{"class":1147}," queries \"\n",[1053,7360,7361,7363,7366,7368,7370,7372],{"class":1055,"line":1527},[1053,7362,7333],{"class":1316},[1053,7364,7365],{"class":1147},"\"(limit: ",[1053,7367,1427],{"class":1426},[1053,7369,7154],{"class":1086},[1053,7371,1436],{"class":1426},[1053,7373,7374],{"class":1147},")\"\n",[1053,7376,7377],{"class":1055,"line":1563},[1053,7378,2315],{"class":1070},[1053,7380,7381],{"class":1055,"line":1860},[1053,7382,2251],{"class":1066},[1053,7384,7385,7388],{"class":1055,"line":1871},[1053,7386,7387],{"class":1171},"            return",[1053,7389,2414],{"class":1066},[1053,7391,7392],{"class":1055,"line":1880},[1053,7393,2406],{"class":1066},[1053,7395,7396,7398],{"class":1055,"line":1896},[1053,7397,2411],{"class":1171},[1053,7399,7400],{"class":1066}," wrapper\n",[1053,7402,7403,7405],{"class":1055,"line":1901},[1053,7404,1757],{"class":1171},[1053,7406,7407],{"class":1066}," decorator\n",[1053,7409,7410],{"class":1055,"line":1914},[1053,7411,1159],{"emptyLinePlaceholder":1158},[1053,7413,7414],{"class":1055,"line":1936},[1053,7415,6996],{"class":1059},[1053,7417,7418,7420,7423,7425,7427,7429,7432],{"class":1055,"line":1958},[1053,7419,1296],{"class":1070},[1053,7421,7422],{"class":1299},"optimize_queries",[1053,7424,1109],{"class":1070},[1053,7426,7154],{"class":1112},[1053,7428,1071],{"class":1070},[1053,7430,7431],{"class":1187},"5",[1053,7433,1122],{"class":1070},[1053,7435,7436,7438,7441,7443,7445],{"class":1055,"line":1980},[1053,7437,1317],{"class":1316},[1053,7439,7440],{"class":1299}," article_list",[1053,7442,1109],{"class":1070},[1053,7444,1628],{"class":1627},[1053,7446,1631],{"class":1070},[1053,7448,7449,7451,7453,7455,7457,7459,7461,7463,7465,7467,7469,7471,7473,7475,7477,7479],{"class":1055,"line":1985},[1053,7450,1360],{"class":1066},[1053,7452,1071],{"class":1070},[1053,7454,1074],{"class":1066},[1053,7456,1077],{"class":1070},[1053,7458,1081],{"class":1080},[1053,7460,1077],{"class":1070},[1053,7462,1373],{"class":1086},[1053,7464,1109],{"class":1070},[1053,7466,1144],{"class":1143},[1053,7468,1380],{"class":1147},[1053,7470,1144],{"class":1143},[1053,7472,1385],{"class":1070},[1053,7474,1087],{"class":1086},[1053,7476,1390],{"class":1070},[1053,7478,7076],{"class":1187},[1053,7480,1395],{"class":1070},[1053,7482,7483,7485,7487,7489,7491,7493,7495,7497,7499,7501,7503,7505,7507,7509,7511,7513],{"class":1055,"line":2417},[1053,7484,1757],{"class":1171},[1053,7486,1760],{"class":1086},[1053,7488,1109],{"class":1070},[1053,7490,1628],{"class":1086},[1053,7492,1767],{"class":1070},[1053,7494,1770],{"class":1143},[1053,7496,7099],{"class":1147},[1053,7498,1144],{"class":1143},[1053,7500,1767],{"class":1070},[1053,7502,1780],{"class":1070},[1053,7504,1144],{"class":1143},[1053,7506,1785],{"class":1147},[1053,7508,1144],{"class":1143},[1053,7510,1790],{"class":1070},[1053,7512,1101],{"class":1086},[1053,7514,1795],{"class":1070},[1030,7516,7518],{"id":7517},"advanced-query-optimization-patterns","Advanced Query Optimization Patterns",[1035,7520,7522],{"id":7521},"query-result-caching","Query Result Caching",[1043,7524,7526],{"className":1045,"code":7525,"language":1047,"meta":1048,"style":1048},"from django.core.cache import cache\nfrom django.core.cache.utils import make_template_fragment_key\n\ndef get_popular_articles(limit=10):\n    \"\"\"Get popular articles with caching\"\"\"\n    cache_key = f'popular_articles_{limit}'\n    articles = cache.get(cache_key)\n    \n    if articles is None:\n        articles = list(\n            Article.objects.select_related('author', 'category')\n            .filter(is_published=True)\n            .order_by('-view_count')[:limit]\n        )\n        \n        # Cache for 1 hour\n        cache.set(cache_key, articles, 3600)\n    \n    return articles\n\n# Cache invalidation\ndef invalidate_article_cache(article):\n    \"\"\"Invalidate related caches when article changes\"\"\"\n    cache_keys = [\n        'popular_articles_10',\n        'popular_articles_20',\n        f'article_{article.id}',\n        f'category_articles_{article.category_id}',\n    ]\n    \n    cache.delete_many(cache_keys)\n",[1050,7527,7528,7548,7572,7576,7594,7603,7624,7644,7648,7663,7673,7703,7720,7742,7747,7751,7756,7781,7785,7792,7796,7801,7814,7823,7832,7843,7854,7875,7897,7901,7905],{"__ignoreMap":1048},[1053,7529,7530,7532,7534,7536,7538,7540,7543,7545],{"class":1055,"line":1056},[1053,7531,1252],{"class":1171},[1053,7533,1255],{"class":1066},[1053,7535,1077],{"class":1070},[1053,7537,5253],{"class":1066},[1053,7539,1077],{"class":1070},[1053,7541,7542],{"class":1066},"cache ",[1053,7544,1263],{"class":1171},[1053,7546,7547],{"class":1066}," cache\n",[1053,7549,7550,7552,7554,7556,7558,7560,7563,7565,7567,7569],{"class":1055,"line":1063},[1053,7551,1252],{"class":1171},[1053,7553,1255],{"class":1066},[1053,7555,1077],{"class":1070},[1053,7557,5253],{"class":1066},[1053,7559,1077],{"class":1070},[1053,7561,7562],{"class":1066},"cache",[1053,7564,1077],{"class":1070},[1053,7566,1282],{"class":1066},[1053,7568,1263],{"class":1171},[1053,7570,7571],{"class":1066}," make_template_fragment_key\n",[1053,7573,7574],{"class":1055,"line":1093},[1053,7575,1159],{"emptyLinePlaceholder":1158},[1053,7577,7578,7580,7583,7585,7588,7590,7592],{"class":1055,"line":1125},[1053,7579,1317],{"class":1316},[1053,7581,7582],{"class":1299}," get_popular_articles",[1053,7584,1109],{"class":1070},[1053,7586,7587],{"class":1627},"limit",[1053,7589,1071],{"class":2238},[1053,7591,1188],{"class":1187},[1053,7593,1631],{"class":1070},[1053,7595,7596,7598,7601],{"class":1055,"line":1155},[1053,7597,6680],{"class":2444},[1053,7599,7600],{"class":2448},"Get popular articles with caching",[1053,7602,2452],{"class":2444},[1053,7604,7605,7608,7610,7613,7616,7618,7620,7622],{"class":1055,"line":1162},[1053,7606,7607],{"class":1066},"    cache_key ",[1053,7609,1071],{"class":1070},[1053,7611,7612],{"class":1316}," f",[1053,7614,7615],{"class":1147},"'popular_articles_",[1053,7617,1427],{"class":1426},[1053,7619,7587],{"class":1066},[1053,7621,1436],{"class":1426},[1053,7623,1857],{"class":1147},[1053,7625,7626,7628,7630,7633,7635,7637,7639,7642],{"class":1055,"line":1168},[1053,7627,1360],{"class":1066},[1053,7629,1071],{"class":1070},[1053,7631,7632],{"class":1066}," cache",[1053,7634,1077],{"class":1070},[1053,7636,2564],{"class":1086},[1053,7638,1109],{"class":1070},[1053,7640,7641],{"class":1086},"cache_key",[1053,7643,1122],{"class":1070},[1053,7645,7646],{"class":1055,"line":1194},[1053,7647,1350],{"class":1066},[1053,7649,7650,7652,7655,7658,7661],{"class":1055,"line":1213},[1053,7651,2968],{"class":1171},[1053,7653,7654],{"class":1066}," articles ",[1053,7656,7657],{"class":2238},"is",[1053,7659,7660],{"class":1118}," None",[1053,7662,1409],{"class":1070},[1053,7664,7665,7667,7669,7671],{"class":1055,"line":1218},[1053,7666,3305],{"class":1066},[1053,7668,1071],{"class":1070},[1053,7670,3663],{"class":3662},[1053,7672,1836],{"class":1070},[1053,7674,7675,7677,7679,7681,7683,7685,7687,7689,7691,7693,7695,7697,7699,7701],{"class":1055,"line":1224},[1053,7676,3200],{"class":1086},[1053,7678,1077],{"class":1070},[1053,7680,1081],{"class":1080},[1053,7682,1077],{"class":1070},[1053,7684,1373],{"class":1086},[1053,7686,1109],{"class":1070},[1053,7688,1144],{"class":1143},[1053,7690,1380],{"class":1147},[1053,7692,1144],{"class":1143},[1053,7694,1767],{"class":1070},[1053,7696,1770],{"class":1143},[1053,7698,1711],{"class":1147},[1053,7700,1144],{"class":1143},[1053,7702,1122],{"class":1070},[1053,7704,7705,7708,7710,7712,7714,7716,7718],{"class":1055,"line":1412},[1053,7706,7707],{"class":1070},"            .",[1053,7709,1106],{"class":1086},[1053,7711,1109],{"class":1070},[1053,7713,1113],{"class":1112},[1053,7715,1071],{"class":1070},[1053,7717,1119],{"class":1118},[1053,7719,1122],{"class":1070},[1053,7721,7722,7724,7726,7728,7730,7733,7735,7738,7740],{"class":1055,"line":1461},[1053,7723,7707],{"class":1070},[1053,7725,1138],{"class":1086},[1053,7727,1109],{"class":1070},[1053,7729,1144],{"class":1143},[1053,7731,7732],{"class":1147},"-view_count",[1053,7734,1144],{"class":1143},[1053,7736,7737],{"class":1070},")[:",[1053,7739,7587],{"class":1086},[1053,7741,1395],{"class":1070},[1053,7743,7744],{"class":1055,"line":1466},[1053,7745,7746],{"class":1070},"        )\n",[1053,7748,7749],{"class":1055,"line":1472},[1053,7750,2406],{"class":1066},[1053,7752,7753],{"class":1055,"line":1508},[1053,7754,7755],{"class":1059},"        # Cache for 1 hour\n",[1053,7757,7758,7761,7763,7766,7768,7770,7772,7774,7776,7779],{"class":1055,"line":1527},[1053,7759,7760],{"class":1066},"        cache",[1053,7762,1077],{"class":1070},[1053,7764,7765],{"class":1086},"set",[1053,7767,1109],{"class":1070},[1053,7769,7641],{"class":1086},[1053,7771,1767],{"class":1070},[1053,7773,1101],{"class":1086},[1053,7775,1767],{"class":1070},[1053,7777,7778],{"class":1187}," 3600",[1053,7780,1122],{"class":1070},[1053,7782,7783],{"class":1055,"line":1563},[1053,7784,1350],{"class":1066},[1053,7786,7787,7789],{"class":1055,"line":1860},[1053,7788,1757],{"class":1171},[1053,7790,7791],{"class":1066}," articles\n",[1053,7793,7794],{"class":1055,"line":1871},[1053,7795,1159],{"emptyLinePlaceholder":1158},[1053,7797,7798],{"class":1055,"line":1880},[1053,7799,7800],{"class":1059},"# Cache invalidation\n",[1053,7802,7803,7805,7808,7810,7812],{"class":1055,"line":1896},[1053,7804,1317],{"class":1316},[1053,7806,7807],{"class":1299}," invalidate_article_cache",[1053,7809,1109],{"class":1070},[1053,7811,1203],{"class":1627},[1053,7813,1631],{"class":1070},[1053,7815,7816,7818,7821],{"class":1055,"line":1901},[1053,7817,6680],{"class":2444},[1053,7819,7820],{"class":2448},"Invalidate related caches when article changes",[1053,7822,2452],{"class":2444},[1053,7824,7825,7828,7830],{"class":1055,"line":1914},[1053,7826,7827],{"class":1066},"    cache_keys ",[1053,7829,1071],{"class":1070},[1053,7831,4795],{"class":1070},[1053,7833,7834,7836,7839,7841],{"class":1055,"line":1936},[1053,7835,1841],{"class":1143},[1053,7837,7838],{"class":1147},"popular_articles_10",[1053,7840,1144],{"class":1143},[1053,7842,1848],{"class":1070},[1053,7844,7845,7847,7850,7852],{"class":1055,"line":1958},[1053,7846,1841],{"class":1143},[1053,7848,7849],{"class":1147},"popular_articles_20",[1053,7851,1144],{"class":1143},[1053,7853,1848],{"class":1070},[1053,7855,7856,7858,7861,7863,7865,7867,7869,7871,7873],{"class":1055,"line":1980},[1053,7857,6807],{"class":1316},[1053,7859,7860],{"class":1147},"'article_",[1053,7862,1427],{"class":1426},[1053,7864,1203],{"class":1066},[1053,7866,1077],{"class":1070},[1053,7868,4544],{"class":1080},[1053,7870,1436],{"class":1426},[1053,7872,1144],{"class":1147},[1053,7874,1848],{"class":1070},[1053,7876,7877,7879,7882,7884,7886,7888,7891,7893,7895],{"class":1055,"line":1985},[1053,7878,6807],{"class":1316},[1053,7880,7881],{"class":1147},"'category_articles_",[1053,7883,1427],{"class":1426},[1053,7885,1203],{"class":1066},[1053,7887,1077],{"class":1070},[1053,7889,7890],{"class":1080},"category_id",[1053,7892,1436],{"class":1426},[1053,7894,1144],{"class":1147},[1053,7896,1848],{"class":1070},[1053,7898,7899],{"class":1055,"line":2417},[1053,7900,6164],{"class":1070},[1053,7902,7903],{"class":1055,"line":2422},[1053,7904,1350],{"class":1066},[1053,7906,7907,7910,7912,7915,7917,7920],{"class":1055,"line":2441},[1053,7908,7909],{"class":1066},"    cache",[1053,7911,1077],{"class":1070},[1053,7913,7914],{"class":1086},"delete_many",[1053,7916,1109],{"class":1070},[1053,7918,7919],{"class":1086},"cache_keys",[1053,7921,1122],{"class":1070},[1035,7923,7925],{"id":7924},"database-connection-optimization","Database Connection Optimization",[1043,7927,7929],{"className":1045,"code":7928,"language":1047,"meta":1048,"style":1048},"# settings.py\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.postgresql',\n        'OPTIONS': {\n            # Connection pooling\n            'MAX_CONNS': 20,\n            'MIN_CONNS': 5,\n            \n            # Query optimization\n            'OPTIONS': {\n                'MAX_CONNS': 20,\n                'MIN_CONNS': 5,\n                'options': '-c default_transaction_isolation=read_committed'\n            }\n        },\n        'CONN_MAX_AGE': 600,  # Connection reuse\n        'CONN_HEALTH_CHECKS': True,\n    }\n}\n\n# Custom database router for read/write splitting\nclass DatabaseRouter:\n    def db_for_read(self, model, **hints):\n        \"\"\"Reading from the read database.\"\"\"\n        return 'read'\n\n    def db_for_write(self, model, **hints):\n        \"\"\"Writing to the write database.\"\"\"\n        return 'write'\n",[1050,7930,7931,7936,7946,7958,7978,7991,7996,8012,8028,8032,8037,8049,8064,8078,8095,8100,8105,8124,8140,8144,8148,8152,8157,8166,8191,8200,8211,8215,8238,8247],{"__ignoreMap":1048},[1053,7932,7933],{"class":1055,"line":1056},[1053,7934,7935],{"class":1059},"# settings.py\n",[1053,7937,7938,7941,7943],{"class":1055,"line":1063},[1053,7939,7940],{"class":2282},"DATABASES",[1053,7942,2155],{"class":1070},[1053,7944,7945],{"class":1070}," {\n",[1053,7947,7948,7950,7952,7954,7956],{"class":1055,"line":1093},[1053,7949,2824],{"class":1143},[1053,7951,5783],{"class":1147},[1053,7953,1144],{"class":1143},[1053,7955,1790],{"class":1070},[1053,7957,7945],{"class":1070},[1053,7959,7960,7962,7965,7967,7969,7971,7974,7976],{"class":1055,"line":1125},[1053,7961,1841],{"class":1143},[1053,7963,7964],{"class":1147},"ENGINE",[1053,7966,1144],{"class":1143},[1053,7968,1790],{"class":1070},[1053,7970,1770],{"class":1143},[1053,7972,7973],{"class":1147},"django.db.backends.postgresql",[1053,7975,1144],{"class":1143},[1053,7977,1848],{"class":1070},[1053,7979,7980,7982,7985,7987,7989],{"class":1055,"line":1155},[1053,7981,1841],{"class":1143},[1053,7983,7984],{"class":1147},"OPTIONS",[1053,7986,1144],{"class":1143},[1053,7988,1790],{"class":1070},[1053,7990,7945],{"class":1070},[1053,7992,7993],{"class":1055,"line":1162},[1053,7994,7995],{"class":1059},"            # Connection pooling\n",[1053,7997,7998,8000,8003,8005,8007,8010],{"class":1055,"line":1168},[1053,7999,7061],{"class":1143},[1053,8001,8002],{"class":1147},"MAX_CONNS",[1053,8004,1144],{"class":1143},[1053,8006,1790],{"class":1070},[1053,8008,8009],{"class":1187}," 20",[1053,8011,1848],{"class":1070},[1053,8013,8014,8016,8019,8021,8023,8026],{"class":1055,"line":1194},[1053,8015,7061],{"class":1143},[1053,8017,8018],{"class":1147},"MIN_CONNS",[1053,8020,1144],{"class":1143},[1053,8022,1790],{"class":1070},[1053,8024,8025],{"class":1187}," 5",[1053,8027,1848],{"class":1070},[1053,8029,8030],{"class":1055,"line":1213},[1053,8031,2251],{"class":1066},[1053,8033,8034],{"class":1055,"line":1218},[1053,8035,8036],{"class":1059},"            # Query optimization\n",[1053,8038,8039,8041,8043,8045,8047],{"class":1055,"line":1224},[1053,8040,7061],{"class":1143},[1053,8042,7984],{"class":1147},[1053,8044,1144],{"class":1143},[1053,8046,1790],{"class":1070},[1053,8048,7945],{"class":1070},[1053,8050,8051,8054,8056,8058,8060,8062],{"class":1055,"line":1412},[1053,8052,8053],{"class":1143},"                '",[1053,8055,8002],{"class":1147},[1053,8057,1144],{"class":1143},[1053,8059,1790],{"class":1070},[1053,8061,8009],{"class":1187},[1053,8063,1848],{"class":1070},[1053,8065,8066,8068,8070,8072,8074,8076],{"class":1055,"line":1461},[1053,8067,8053],{"class":1143},[1053,8069,8018],{"class":1147},[1053,8071,1144],{"class":1143},[1053,8073,1790],{"class":1070},[1053,8075,8025],{"class":1187},[1053,8077,1848],{"class":1070},[1053,8079,8080,8082,8084,8086,8088,8090,8093],{"class":1055,"line":1466},[1053,8081,8053],{"class":1143},[1053,8083,5344],{"class":1147},[1053,8085,1144],{"class":1143},[1053,8087,1790],{"class":1070},[1053,8089,1770],{"class":1143},[1053,8091,8092],{"class":1147},"-c default_transaction_isolation=read_committed",[1053,8094,1857],{"class":1143},[1053,8096,8097],{"class":1055,"line":1472},[1053,8098,8099],{"class":1070},"            }\n",[1053,8101,8102],{"class":1055,"line":1508},[1053,8103,8104],{"class":1070},"        },\n",[1053,8106,8107,8109,8112,8114,8116,8119,8121],{"class":1055,"line":1527},[1053,8108,1841],{"class":1143},[1053,8110,8111],{"class":1147},"CONN_MAX_AGE",[1053,8113,1144],{"class":1143},[1053,8115,1790],{"class":1070},[1053,8117,8118],{"class":1187}," 600",[1053,8120,1767],{"class":1070},[1053,8122,8123],{"class":1059},"  # Connection reuse\n",[1053,8125,8126,8128,8131,8133,8135,8138],{"class":1055,"line":1563},[1053,8127,1841],{"class":1143},[1053,8129,8130],{"class":1147},"CONN_HEALTH_CHECKS",[1053,8132,1144],{"class":1143},[1053,8134,1790],{"class":1070},[1053,8136,8137],{"class":1118}," True",[1053,8139,1848],{"class":1070},[1053,8141,8142],{"class":1055,"line":1860},[1053,8143,5216],{"class":1070},[1053,8145,8146],{"class":1055,"line":1871},[1053,8147,2641],{"class":1070},[1053,8149,8150],{"class":1055,"line":1880},[1053,8151,1159],{"emptyLinePlaceholder":1158},[1053,8153,8154],{"class":1055,"line":1896},[1053,8155,8156],{"class":1059},"# Custom database router for read/write splitting\n",[1053,8158,8159,8161,8164],{"class":1055,"line":1901},[1053,8160,2109],{"class":1316},[1053,8162,8163],{"class":2112}," DatabaseRouter",[1053,8165,1409],{"class":1070},[1053,8167,8168,8170,8173,8175,8177,8179,8182,8184,8186,8189],{"class":1055,"line":1914},[1053,8169,2126],{"class":1316},[1053,8171,8172],{"class":1299}," db_for_read",[1053,8174,1109],{"class":1070},[1053,8176,2135],{"class":2134},[1053,8178,1767],{"class":1070},[1053,8180,8181],{"class":1627}," model",[1053,8183,1767],{"class":1070},[1053,8185,5341],{"class":2238},[1053,8187,8188],{"class":1627},"hints",[1053,8190,1631],{"class":1070},[1053,8192,8193,8195,8198],{"class":1055,"line":1936},[1053,8194,2445],{"class":2444},[1053,8196,8197],{"class":2448},"Reading from the read database.",[1053,8199,2452],{"class":2444},[1053,8201,8202,8204,8206,8209],{"class":1055,"line":1958},[1053,8203,2411],{"class":1171},[1053,8205,1770],{"class":1143},[1053,8207,8208],{"class":1147},"read",[1053,8210,1857],{"class":1143},[1053,8212,8213],{"class":1055,"line":1980},[1053,8214,1159],{"emptyLinePlaceholder":1158},[1053,8216,8217,8219,8222,8224,8226,8228,8230,8232,8234,8236],{"class":1055,"line":1985},[1053,8218,2126],{"class":1316},[1053,8220,8221],{"class":1299}," db_for_write",[1053,8223,1109],{"class":1070},[1053,8225,2135],{"class":2134},[1053,8227,1767],{"class":1070},[1053,8229,8181],{"class":1627},[1053,8231,1767],{"class":1070},[1053,8233,5341],{"class":2238},[1053,8235,8188],{"class":1627},[1053,8237,1631],{"class":1070},[1053,8239,8240,8242,8245],{"class":1055,"line":2417},[1053,8241,2445],{"class":2444},[1053,8243,8244],{"class":2448},"Writing to the write database.",[1053,8246,2452],{"class":2444},[1053,8248,8249,8251,8253,8255],{"class":1055,"line":2422},[1053,8250,2411],{"class":1171},[1053,8252,1770],{"class":1143},[1053,8254,5487],{"class":1147},[1053,8256,1857],{"class":1143},[1035,8258,8260],{"id":8259},"query-optimization-testing","Query Optimization Testing",[1043,8262,8264],{"className":1045,"code":8263,"language":1047,"meta":1048,"style":1048},"from django.test import TestCase, override_settings\nfrom django.test.utils import override_settings\n\nclass QueryOptimizationTest(TestCase):\n    def setUp(self):\n        # Create test data\n        self.create_test_data()\n    \n    def test_article_list_queries(self):\n        \"\"\"Test that article list doesn't have N+1 queries\"\"\"\n        with self.assertNumQueries(3):  # articles, authors, tags\n            articles = Article.objects.select_related('author').prefetch_related('tags').all()[:10]\n            \n            # Force evaluation\n            for article in articles:\n                _ = article.author.name\n                _ = list(article.tags.all())\n    \n    def test_query_performance(self):\n        \"\"\"Test query performance benchmarks\"\"\"\n        import time\n        \n        start_time = time.time()\n        \n        # Your optimized query\n        articles = Article.objects.select_related('author').prefetch_related('tags').all()[:100]\n        list(articles)  # Force evaluation\n        \n        end_time = time.time()\n        duration = end_time - start_time\n        \n        # Assert performance requirement\n        self.assertLess(duration, 0.5, \"Query took too long\")\n    \n    @override_settings(DEBUG=True)\n    def test_query_analysis(self):\n        \"\"\"Analyze queries for optimization opportunities\"\"\"\n        from django.db import connection\n        \n        connection.queries_log.clear()\n        \n        # Execute your view logic\n        articles = Article.objects.all()[:10]\n        for article in articles:\n            _ = article.author.name\n        \n        queries = connection.queries\n        \n        # Analyze query patterns\n        similar_queries = {}\n        for query in queries:\n            sql = query['sql']\n            # Group similar queries\n            pattern = re.sub(r'\\d+', 'N', sql)\n            similar_queries[pattern] = similar_queries.get(pattern, 0) + 1\n        \n        # Check for N+1 patterns\n        for pattern, count in similar_queries.items():\n            if count > 5:\n                self.fail(f\"Potential N+1 query detected: {pattern} (count: {count})\")\n",[1050,8265,8266,8285,8303,8307,8320,8332,8336,8348,8352,8365,8374,8396,8443,8447,8452,8464,8482,8505,8509,8522,8531,8538,8542,8556,8560,8565,8611,8625,8629,8643,8656,8660,8665,8694,8698,8715,8728,8737,8752,8756,8771,8775,8780,8802,8814,8831,8835,8849,8853,8858,8867,8879,8898,8903,8944,8978,8982,8987,9009,9022],{"__ignoreMap":1048},[1053,8267,8268,8270,8272,8274,8276,8278,8281,8283],{"class":1055,"line":1056},[1053,8269,1252],{"class":1171},[1053,8271,1255],{"class":1066},[1053,8273,1077],{"class":1070},[1053,8275,3094],{"class":1066},[1053,8277,1263],{"class":1171},[1053,8279,8280],{"class":1066}," TestCase",[1053,8282,1767],{"class":1070},[1053,8284,1287],{"class":1066},[1053,8286,8287,8289,8291,8293,8295,8297,8299,8301],{"class":1055,"line":1063},[1053,8288,1252],{"class":1171},[1053,8290,1255],{"class":1066},[1053,8292,1077],{"class":1070},[1053,8294,1277],{"class":1066},[1053,8296,1077],{"class":1070},[1053,8298,1282],{"class":1066},[1053,8300,1263],{"class":1171},[1053,8302,1287],{"class":1066},[1053,8304,8305],{"class":1055,"line":1093},[1053,8306,1159],{"emptyLinePlaceholder":1158},[1053,8308,8309,8311,8314,8316,8318],{"class":1055,"line":1125},[1053,8310,2109],{"class":1316},[1053,8312,8313],{"class":2112}," QueryOptimizationTest",[1053,8315,1109],{"class":1070},[1053,8317,3115],{"class":2118},[1053,8319,1631],{"class":1070},[1053,8321,8322,8324,8326,8328,8330],{"class":1055,"line":1155},[1053,8323,2126],{"class":1316},[1053,8325,3124],{"class":1299},[1053,8327,1109],{"class":1070},[1053,8329,2135],{"class":2134},[1053,8331,1631],{"class":1070},[1053,8333,8334],{"class":1055,"line":1162},[1053,8335,3135],{"class":1059},[1053,8337,8338,8341,8343,8346],{"class":1055,"line":1168},[1053,8339,8340],{"class":2282},"        self",[1053,8342,1077],{"class":1070},[1053,8344,8345],{"class":1086},"create_test_data",[1053,8347,1090],{"class":1070},[1053,8349,8350],{"class":1055,"line":1194},[1053,8351,1350],{"class":1066},[1053,8353,8354,8356,8359,8361,8363],{"class":1055,"line":1213},[1053,8355,2126],{"class":1316},[1053,8357,8358],{"class":1299}," test_article_list_queries",[1053,8360,1109],{"class":1070},[1053,8362,2135],{"class":2134},[1053,8364,1631],{"class":1070},[1053,8366,8367,8369,8372],{"class":1055,"line":1218},[1053,8368,2445],{"class":2444},[1053,8370,8371],{"class":2448},"Test that article list doesn't have N+1 queries",[1053,8373,2452],{"class":2444},[1053,8375,8376,8378,8380,8382,8385,8387,8390,8393],{"class":1055,"line":1224},[1053,8377,5351],{"class":1171},[1053,8379,2283],{"class":2282},[1053,8381,1077],{"class":1070},[1053,8383,8384],{"class":1086},"assertNumQueries",[1053,8386,1109],{"class":1070},[1053,8388,8389],{"class":1187},"3",[1053,8391,8392],{"class":1070},"):",[1053,8394,8395],{"class":1059},"  # articles, authors, tags\n",[1053,8397,8398,8401,8403,8405,8407,8409,8411,8413,8415,8417,8419,8421,8423,8425,8427,8429,8431,8433,8435,8437,8439,8441],{"class":1055,"line":1412},[1053,8399,8400],{"class":1066},"            articles ",[1053,8402,1071],{"class":1070},[1053,8404,1074],{"class":1066},[1053,8406,1077],{"class":1070},[1053,8408,1081],{"class":1080},[1053,8410,1077],{"class":1070},[1053,8412,1373],{"class":1086},[1053,8414,1109],{"class":1070},[1053,8416,1144],{"class":1143},[1053,8418,1380],{"class":1147},[1053,8420,1144],{"class":1143},[1053,8422,1385],{"class":1070},[1053,8424,1866],{"class":1086},[1053,8426,1109],{"class":1070},[1053,8428,1144],{"class":1143},[1053,8430,1733],{"class":1147},[1053,8432,1144],{"class":1143},[1053,8434,1385],{"class":1070},[1053,8436,1087],{"class":1086},[1053,8438,1390],{"class":1070},[1053,8440,1188],{"class":1187},[1053,8442,1395],{"class":1070},[1053,8444,8445],{"class":1055,"line":1461},[1053,8446,2251],{"class":1066},[1053,8448,8449],{"class":1055,"line":1466},[1053,8450,8451],{"class":1059},"            # Force evaluation\n",[1053,8453,8454,8456,8458,8460,8462],{"class":1055,"line":1472},[1053,8455,5448],{"class":1171},[1053,8457,1175],{"class":1066},[1053,8459,1178],{"class":1171},[1053,8461,1101],{"class":1066},[1053,8463,1409],{"class":1070},[1053,8465,8466,8469,8471,8473,8475,8477,8479],{"class":1055,"line":1508},[1053,8467,8468],{"class":1066},"                _ ",[1053,8470,1071],{"class":1070},[1053,8472,3931],{"class":1066},[1053,8474,1077],{"class":1070},[1053,8476,1380],{"class":1080},[1053,8478,1077],{"class":1070},[1053,8480,8481],{"class":1080},"name\n",[1053,8483,8484,8486,8488,8490,8492,8494,8496,8498,8500,8502],{"class":1055,"line":1527},[1053,8485,8468],{"class":1066},[1053,8487,1071],{"class":1070},[1053,8489,3663],{"class":3662},[1053,8491,1109],{"class":1070},[1053,8493,1203],{"class":1086},[1053,8495,1077],{"class":1070},[1053,8497,1733],{"class":1080},[1053,8499,1077],{"class":1070},[1053,8501,1087],{"class":1086},[1053,8503,8504],{"class":1070},"())\n",[1053,8506,8507],{"class":1055,"line":1563},[1053,8508,1350],{"class":1066},[1053,8510,8511,8513,8516,8518,8520],{"class":1055,"line":1860},[1053,8512,2126],{"class":1316},[1053,8514,8515],{"class":1299}," test_query_performance",[1053,8517,1109],{"class":1070},[1053,8519,2135],{"class":2134},[1053,8521,1631],{"class":1070},[1053,8523,8524,8526,8529],{"class":1055,"line":1871},[1053,8525,2445],{"class":2444},[1053,8527,8528],{"class":2448},"Test query performance benchmarks",[1053,8530,2452],{"class":2444},[1053,8532,8533,8536],{"class":1055,"line":1880},[1053,8534,8535],{"class":1171},"        import",[1053,8537,3083],{"class":1066},[1053,8539,8540],{"class":1055,"line":1896},[1053,8541,2406],{"class":1066},[1053,8543,8544,8546,8548,8550,8552,8554],{"class":1055,"line":1901},[1053,8545,3285],{"class":1066},[1053,8547,1071],{"class":1070},[1053,8549,3290],{"class":1066},[1053,8551,1077],{"class":1070},[1053,8553,1583],{"class":1086},[1053,8555,1090],{"class":1070},[1053,8557,8558],{"class":1055,"line":1914},[1053,8559,2406],{"class":1066},[1053,8561,8562],{"class":1055,"line":1936},[1053,8563,8564],{"class":1059},"        # Your optimized query\n",[1053,8566,8567,8569,8571,8573,8575,8577,8579,8581,8583,8585,8587,8589,8591,8593,8595,8597,8599,8601,8603,8605,8607,8609],{"class":1055,"line":1958},[1053,8568,3305],{"class":1066},[1053,8570,1071],{"class":1070},[1053,8572,1074],{"class":1066},[1053,8574,1077],{"class":1070},[1053,8576,1081],{"class":1080},[1053,8578,1077],{"class":1070},[1053,8580,1373],{"class":1086},[1053,8582,1109],{"class":1070},[1053,8584,1144],{"class":1143},[1053,8586,1380],{"class":1147},[1053,8588,1144],{"class":1143},[1053,8590,1385],{"class":1070},[1053,8592,1866],{"class":1086},[1053,8594,1109],{"class":1070},[1053,8596,1144],{"class":1143},[1053,8598,1733],{"class":1147},[1053,8600,1144],{"class":1143},[1053,8602,1385],{"class":1070},[1053,8604,1087],{"class":1086},[1053,8606,1390],{"class":1070},[1053,8608,3152],{"class":1187},[1053,8610,1395],{"class":1070},[1053,8612,8613,8616,8618,8620,8622],{"class":1055,"line":1980},[1053,8614,8615],{"class":3662},"        list",[1053,8617,1109],{"class":1070},[1053,8619,1785],{"class":1086},[1053,8621,1499],{"class":1070},[1053,8623,8624],{"class":1059},"  # Force evaluation\n",[1053,8626,8627],{"class":1055,"line":1985},[1053,8628,2406],{"class":1066},[1053,8630,8631,8633,8635,8637,8639,8641],{"class":1055,"line":2417},[1053,8632,3359],{"class":1066},[1053,8634,1071],{"class":1070},[1053,8636,3290],{"class":1066},[1053,8638,1077],{"class":1070},[1053,8640,1583],{"class":1086},[1053,8642,1090],{"class":1070},[1053,8644,8645,8648,8650,8652,8654],{"class":1055,"line":2422},[1053,8646,8647],{"class":1066},"        duration ",[1053,8649,1071],{"class":1070},[1053,8651,6781],{"class":1066},[1053,8653,3388],{"class":2238},[1053,8655,6786],{"class":1066},[1053,8657,8658],{"class":1055,"line":2441},[1053,8659,2406],{"class":1066},[1053,8661,8662],{"class":1055,"line":2455},[1053,8663,8664],{"class":1059},"        # Assert performance requirement\n",[1053,8666,8667,8669,8671,8674,8676,8678,8680,8682,8684,8687,8690,8692],{"class":1055,"line":2466},[1053,8668,8340],{"class":2282},[1053,8670,1077],{"class":1070},[1053,8672,8673],{"class":1086},"assertLess",[1053,8675,1109],{"class":1070},[1053,8677,6831],{"class":1086},[1053,8679,1767],{"class":1070},[1053,8681,6863],{"class":1187},[1053,8683,1767],{"class":1070},[1053,8685,8686],{"class":1143}," \"",[1053,8688,8689],{"class":1147},"Query took too long",[1053,8691,1423],{"class":1143},[1053,8693,1122],{"class":1070},[1053,8695,8696],{"class":1055,"line":2480},[1053,8697,1350],{"class":1066},[1053,8699,8700,8703,8705,8707,8709,8711,8713],{"class":1055,"line":2486},[1053,8701,8702],{"class":1070},"    @",[1053,8704,1300],{"class":1299},[1053,8706,1109],{"class":1070},[1053,8708,1305],{"class":1112},[1053,8710,1071],{"class":1070},[1053,8712,1119],{"class":1118},[1053,8714,1122],{"class":1070},[1053,8716,8717,8719,8722,8724,8726],{"class":1055,"line":2544},[1053,8718,2126],{"class":1316},[1053,8720,8721],{"class":1299}," test_query_analysis",[1053,8723,1109],{"class":1070},[1053,8725,2135],{"class":2134},[1053,8727,1631],{"class":1070},[1053,8729,8730,8732,8735],{"class":1055,"line":2584},[1053,8731,2445],{"class":2444},[1053,8733,8734],{"class":2448},"Analyze queries for optimization opportunities",[1053,8736,2452],{"class":2444},[1053,8738,8739,8742,8744,8746,8748,8750],{"class":1055,"line":2589},[1053,8740,8741],{"class":1171},"        from",[1053,8743,1255],{"class":1066},[1053,8745,1077],{"class":1070},[1053,8747,1260],{"class":1066},[1053,8749,1263],{"class":1171},[1053,8751,1266],{"class":1066},[1053,8753,8754],{"class":1055,"line":2595},[1053,8755,2406],{"class":1066},[1053,8757,8758,8761,8763,8765,8767,8769],{"class":1055,"line":6167},[1053,8759,8760],{"class":1066},"        connection",[1053,8762,1077],{"class":1070},[1053,8764,1338],{"class":1080},[1053,8766,1077],{"class":1070},[1053,8768,1343],{"class":1086},[1053,8770,1090],{"class":1070},[1053,8772,8773],{"class":1055,"line":6172},[1053,8774,2406],{"class":1066},[1053,8776,8777],{"class":1055,"line":6182},[1053,8778,8779],{"class":1059},"        # Execute your view logic\n",[1053,8781,8782,8784,8786,8788,8790,8792,8794,8796,8798,8800],{"class":1055,"line":6195},[1053,8783,3305],{"class":1066},[1053,8785,1071],{"class":1070},[1053,8787,1074],{"class":1066},[1053,8789,1077],{"class":1070},[1053,8791,1081],{"class":1080},[1053,8793,1077],{"class":1070},[1053,8795,1087],{"class":1086},[1053,8797,1390],{"class":1070},[1053,8799,1188],{"class":1187},[1053,8801,1395],{"class":1070},[1053,8803,8804,8806,8808,8810,8812],{"class":1055,"line":6201},[1053,8805,2469],{"class":1171},[1053,8807,1175],{"class":1066},[1053,8809,1178],{"class":1171},[1053,8811,1101],{"class":1066},[1053,8813,1409],{"class":1070},[1053,8815,8816,8819,8821,8823,8825,8827,8829],{"class":1055,"line":6212},[1053,8817,8818],{"class":1066},"            _ ",[1053,8820,1071],{"class":1070},[1053,8822,3931],{"class":1066},[1053,8824,1077],{"class":1070},[1053,8826,1380],{"class":1080},[1053,8828,1077],{"class":1070},[1053,8830,8481],{"class":1080},[1053,8832,8833],{"class":1055,"line":6222},[1053,8834,2406],{"class":1066},[1053,8836,8837,8840,8842,8844,8846],{"class":1055,"line":6234},[1053,8838,8839],{"class":1066},"        queries ",[1053,8841,1071],{"class":1070},[1053,8843,1518],{"class":1066},[1053,8845,1077],{"class":1070},[1053,8847,8848],{"class":1080},"queries\n",[1053,8850,8851],{"class":1055,"line":6239},[1053,8852,2406],{"class":1066},[1053,8854,8855],{"class":1055,"line":6254},[1053,8856,8857],{"class":1059},"        # Analyze query patterns\n",[1053,8859,8860,8863,8865],{"class":1055,"line":6260},[1053,8861,8862],{"class":1066},"        similar_queries ",[1053,8864,1071],{"class":1070},[1053,8866,2463],{"class":1070},[1053,8868,8869,8871,8873,8875,8877],{"class":1055,"line":6265},[1053,8870,2469],{"class":1171},[1053,8872,1513],{"class":1066},[1053,8874,1178],{"class":1171},[1053,8876,2436],{"class":1066},[1053,8878,1409],{"class":1070},[1053,8880,8881,8884,8886,8888,8890,8892,8894,8896],{"class":1055,"line":6276},[1053,8882,8883],{"class":1066},"            sql ",[1053,8885,1071],{"class":1070},[1053,8887,2530],{"class":1066},[1053,8889,1544],{"class":1070},[1053,8891,1144],{"class":1143},[1053,8893,1549],{"class":1147},[1053,8895,1144],{"class":1143},[1053,8897,1395],{"class":1070},[1053,8899,8900],{"class":1055,"line":6282},[1053,8901,8902],{"class":1059},"            # Group similar queries\n",[1053,8904,8905,8908,8910,8912,8914,8916,8918,8920,8922,8924,8926,8928,8930,8932,8935,8937,8939,8942],{"class":1055,"line":6292},[1053,8906,8907],{"class":1066},"            pattern ",[1053,8909,1071],{"class":1070},[1053,8911,2494],{"class":1066},[1053,8913,1077],{"class":1070},[1053,8915,2499],{"class":1086},[1053,8917,1109],{"class":1070},[1053,8919,2504],{"class":1316},[1053,8921,1144],{"class":1143},[1053,8923,2510],{"class":2509},[1053,8925,2514],{"class":2513},[1053,8927,1144],{"class":1143},[1053,8929,1767],{"class":1070},[1053,8931,1770],{"class":1143},[1053,8933,8934],{"class":1147},"N",[1053,8936,1144],{"class":1143},[1053,8938,1767],{"class":1070},[1053,8940,8941],{"class":1086}," sql",[1053,8943,1122],{"class":1070},[1053,8945,8946,8949,8951,8954,8956,8958,8960,8962,8964,8966,8968,8970,8972,8974,8976],{"class":1055,"line":6304},[1053,8947,8948],{"class":1066},"            similar_queries",[1053,8950,1544],{"class":1070},[1053,8952,8953],{"class":1066},"pattern",[1053,8955,1554],{"class":1070},[1053,8957,2155],{"class":1070},[1053,8959,2328],{"class":1066},[1053,8961,1077],{"class":1070},[1053,8963,2564],{"class":1086},[1053,8965,1109],{"class":1070},[1053,8967,8953],{"class":1086},[1053,8969,1767],{"class":1070},[1053,8971,2573],{"class":1187},[1053,8973,1499],{"class":1070},[1053,8975,2578],{"class":2238},[1053,8977,2581],{"class":1187},[1053,8979,8980],{"class":1055,"line":6309},[1053,8981,2406],{"class":1066},[1053,8983,8984],{"class":1055,"line":6323},[1053,8985,8986],{"class":1059},"        # Check for N+1 patterns\n",[1053,8988,8989,8991,8994,8996,8999,9001,9003,9005,9007],{"class":1055,"line":6328},[1053,8990,2469],{"class":1171},[1053,8992,8993],{"class":1066}," pattern",[1053,8995,1767],{"class":1070},[1053,8997,8998],{"class":1066}," count ",[1053,9000,1178],{"class":1171},[1053,9002,2328],{"class":1066},[1053,9004,1077],{"class":1070},[1053,9006,2625],{"class":1086},[1053,9008,1323],{"class":1070},[1053,9010,9012,9014,9016,9018,9020],{"class":1055,"line":9011},59,[1053,9013,2261],{"class":1171},[1053,9015,8998],{"class":1066},[1053,9017,2267],{"class":2238},[1053,9019,8025],{"class":1187},[1053,9021,1409],{"class":1070},[1053,9023,9025,9027,9029,9032,9034,9036,9039,9041,9043,9045,9048,9050,9052,9054,9057],{"class":1055,"line":9024},60,[1053,9026,5477],{"class":2282},[1053,9028,1077],{"class":1070},[1053,9030,9031],{"class":1086},"fail",[1053,9033,1109],{"class":1070},[1053,9035,1420],{"class":1316},[1053,9037,9038],{"class":1147},"\"Potential N+1 query detected: ",[1053,9040,1427],{"class":1426},[1053,9042,8953],{"class":1086},[1053,9044,1436],{"class":1426},[1053,9046,9047],{"class":1147}," (count: ",[1053,9049,1427],{"class":1426},[1053,9051,1236],{"class":1086},[1053,9053,1436],{"class":1426},[1053,9055,9056],{"class":1147},")\"",[1053,9058,1122],{"class":1070},[1026,9060,9061],{},"This comprehensive query optimization guide provides the foundation for building high-performance Django applications by eliminating database bottlenecks and implementing efficient data access patterns.",[9063,9064,9065],"style",{},"html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sqOPj, html code.shiki .sqOPj{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B07D48;--shiki-default-font-style:inherit;--shiki-dark:#BD976A;--shiki-dark-font-style:inherit}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sCyAa, html code.shiki .sCyAa{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sRjD_, html code.shiki .sRjD_{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .sRJPX, html code.shiki .sRJPX{--shiki-light:#91B859;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sGuSu, html code.shiki .sGuSu{--shiki-light:#39ADB5;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}",{"title":1048,"searchDepth":1056,"depth":1063,"links":9067},[9068,9072,9076,9082,9088,9094,9099,9103],{"id":1032,"depth":1063,"text":1033,"children":9069},[9070,9071],{"id":1037,"depth":1093,"text":1038},{"id":1241,"depth":1093,"text":1242},{"id":1597,"depth":1063,"text":1598,"children":9073},[9074,9075],{"id":1604,"depth":1093,"text":1605},{"id":2020,"depth":1093,"text":2021},{"id":2644,"depth":1063,"text":2645,"children":9077},[9078,9079,9080,9081],{"id":2653,"depth":1093,"text":2654},{"id":2790,"depth":1093,"text":2791},{"id":2897,"depth":1093,"text":2898},{"id":3070,"depth":1093,"text":3071},{"id":3602,"depth":1063,"text":3603,"children":9083},[9084,9085,9086,9087],{"id":3611,"depth":1093,"text":3612},{"id":3757,"depth":1093,"text":3758},{"id":3984,"depth":1093,"text":3985},{"id":4111,"depth":1093,"text":4112},{"id":4256,"depth":1063,"text":4257,"children":9089},[9090,9091,9092,9093],{"id":4260,"depth":1093,"text":4261},{"id":4447,"depth":1093,"text":4448},{"id":4772,"depth":1093,"text":4773},{"id":5061,"depth":1093,"text":5062},{"id":5227,"depth":1063,"text":5228,"children":9095},[9096,9097,9098],{"id":5231,"depth":1093,"text":5232},{"id":5597,"depth":1093,"text":5598},{"id":6333,"depth":1093,"text":6334},{"id":6571,"depth":1063,"text":6572,"children":9100},[9101,9102],{"id":6575,"depth":1093,"text":6576},{"id":7120,"depth":1093,"text":7121},{"id":7517,"depth":1063,"text":7518,"children":9104},[9105,9106,9107],{"id":7521,"depth":1093,"text":7522},{"id":7924,"depth":1093,"text":7925},{"id":8259,"depth":1093,"text":8260},"md",null,{},{"title":781,"description":1028},"qsrwwItLmsYJRjnNryk3o-5Id3cs-CU4rYF99A_Lyt4",[9114,9116],{"title":775,"path":776,"stem":777,"description":9115,"children":-1},"Performance optimization is critical for building scalable Django applications that provide excellent user experiences. This comprehensive guide covers database query optimization, template rendering, caching strategies, profiling techniques, and advanced optimization patterns that transform slow applications into high-performance systems.",{"title":785,"path":786,"stem":787,"description":9117,"children":-1},"Template rendering can be a significant performance bottleneck in Django applications. This chapter covers comprehensive template optimization techniques, from reducing template complexity to implementing advanced caching strategies that dramatically improve rendering performance.",1772474955617]