[{"data":1,"prerenderedAt":9316},["ShallowReactive",2],{"navigation":3,"/migrations/squashing-migrations":1016,"/migrations/squashing-migrations-surround":9311},[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":374,"body":1018,"description":1028,"extension":9306,"links":9307,"meta":9308,"navigation":1298,"path":375,"seo":9309,"stem":376,"__hash__":9310},"docs/08.migrations/11.squashing-migrations.md",{"type":1019,"value":1020,"toc":9294},"minimark",[1021,1025,1029,1034,1039,2290,2294,4438,4442,4446,7195,7199,7203,9287,9290],[1022,1023,374],"h1",{"id":1024},"squashing-migrations",[1026,1027,1028],"p",{},"Migration squashing combines multiple migrations into a single, optimized migration file. This process helps maintain a clean migration history, improves performance, and reduces complexity in long-running projects. Understanding when and how to squash migrations is essential for maintaining a healthy Django project.",[1030,1031,1033],"h2",{"id":1032},"understanding-migration-squashing","Understanding Migration Squashing",[1035,1036,1038],"h3",{"id":1037},"what-is-migration-squashing","What is Migration Squashing?",[1040,1041,1046],"pre",{"className":1042,"code":1043,"language":1044,"meta":1045,"style":1045},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Before squashing: Multiple migrations\n# blog/migrations/0001_initial.py\nclass Migration(migrations.Migration):\n    initial = True\n    dependencies = []\n    \n    operations = [\n        migrations.CreateModel(\n            name='Post',\n            fields=[\n                ('id', models.AutoField(primary_key=True)),\n                ('title', models.CharField(max_length=200)),\n                ('content', models.TextField()),\n            ],\n        ),\n    ]\n\n# blog/migrations/0002_add_author.py\nclass Migration(migrations.Migration):\n    dependencies = [('blog', '0001_initial')]\n    \n    operations = [\n        migrations.AddField(\n            model_name='post',\n            name='author',\n            field=models.CharField(max_length=100, default='Anonymous'),\n        ),\n    ]\n\n# blog/migrations/0003_add_created_at.py\nclass Migration(migrations.Migration):\n    dependencies = [('blog', '0002_add_author')]\n    \n    operations = [\n        migrations.AddField(\n            model_name='post',\n            name='created_at',\n            field=models.DateTimeField(auto_now_add=True, default=timezone.now),\n            preserve_default=False,\n        ),\n    ]\n\n# blog/migrations/0004_add_status.py\nclass Migration(migrations.Migration):\n    dependencies = [('blog', '0003_add_created_at')]\n    \n    operations = [\n        migrations.AddField(\n            model_name='post',\n            name='status',\n            field=models.CharField(max_length=20, default='draft'),\n        ),\n    ]\n\n# After squashing: Single optimized migration\n# Command: python manage.py squashmigrations blog 0001 0004\n# Generated: blog/migrations/0001_squashed_0001_0004_initial.py\n\nclass Migration(migrations.Migration):\n    \"\"\"Squashed migration combining 0001-0004\"\"\"\n    \n    initial = True\n    \n    dependencies = []\n    \n    # List of migrations this squashed migration replaces\n    replaces = [\n        ('blog', '0001_initial'),\n        ('blog', '0002_add_author'),\n        ('blog', '0003_add_created_at'),\n        ('blog', '0004_add_status'),\n    ]\n    \n    operations = [\n        # Optimized: Create model with all fields at once\n        migrations.CreateModel(\n            name='Post',\n            fields=[\n                ('id', models.AutoField(primary_key=True)),\n                ('title', models.CharField(max_length=200)),\n                ('content', models.TextField()),\n                ('author', models.CharField(max_length=100, default='Anonymous')),\n                ('created_at', models.DateTimeField(auto_now_add=True)),\n                ('status', models.CharField(max_length=20, default='draft')),\n            ],\n        ),\n    ]\n\n# Basic squashing command\n# python manage.py squashmigrations app_name start_migration end_migration\n\n# Examples:\n# python manage.py squashmigrations blog 0001 0004\n# python manage.py squashmigrations blog 0005 0010 --squashed-name combined_features\n","python","",[1047,1048,1049,1058,1064,1092,1106,1117,1123,1134,1149,1171,1180,1217,1251,1275,1281,1287,1293,1300,1306,1323,1353,1358,1367,1379,1396,1412,1453,1458,1463,1468,1474,1491,1517,1522,1531,1542,1557,1573,1613,1626,1631,1636,1641,1647,1664,1690,1695,1704,1715,1730,1746,1783,1788,1793,1798,1804,1810,1816,1821,1838,1852,1857,1866,1871,1880,1885,1891,1901,1923,1944,1965,1987,1992,1997,2006,2012,2023,2038,2045,2074,2103,2124,2165,2194,2235,2240,2245,2250,2255,2261,2267,2272,2278,2284],"code",{"__ignoreMap":1045},[1050,1051,1054],"span",{"class":1052,"line":1053},"line",1,[1050,1055,1057],{"class":1056},"s9Tkl","# Before squashing: Multiple migrations\n",[1050,1059,1061],{"class":1052,"line":1060},2,[1050,1062,1063],{"class":1056},"# blog/migrations/0001_initial.py\n",[1050,1065,1067,1071,1075,1079,1083,1086,1089],{"class":1052,"line":1066},3,[1050,1068,1070],{"class":1069},"s5Kfy","class",[1050,1072,1074],{"class":1073},"sD-vU"," Migration",[1050,1076,1078],{"class":1077},"soVBu","(",[1050,1080,1082],{"class":1081},"sYn-s","migrations",[1050,1084,1085],{"class":1077},".",[1050,1087,1088],{"class":1081},"Migration",[1050,1090,1091],{"class":1077},"):\n",[1050,1093,1095,1099,1102],{"class":1052,"line":1094},4,[1050,1096,1098],{"class":1097},"sftqT","    initial ",[1050,1100,1101],{"class":1077},"=",[1050,1103,1105],{"class":1104},"s8XtY"," True\n",[1050,1107,1109,1112,1114],{"class":1052,"line":1108},5,[1050,1110,1111],{"class":1097},"    dependencies ",[1050,1113,1101],{"class":1077},[1050,1115,1116],{"class":1077}," []\n",[1050,1118,1120],{"class":1052,"line":1119},6,[1050,1121,1122],{"class":1097},"    \n",[1050,1124,1126,1129,1131],{"class":1052,"line":1125},7,[1050,1127,1128],{"class":1097},"    operations ",[1050,1130,1101],{"class":1077},[1050,1132,1133],{"class":1077}," [\n",[1050,1135,1137,1140,1142,1146],{"class":1052,"line":1136},8,[1050,1138,1139],{"class":1097},"        migrations",[1050,1141,1085],{"class":1077},[1050,1143,1145],{"class":1144},"siWMO","CreateModel",[1050,1147,1148],{"class":1077},"(\n",[1050,1150,1152,1156,1158,1162,1166,1168],{"class":1052,"line":1151},9,[1050,1153,1155],{"class":1154},"sqOPj","            name",[1050,1157,1101],{"class":1077},[1050,1159,1161],{"class":1160},"sbYkP","'",[1050,1163,1165],{"class":1164},"sTbE_","Post",[1050,1167,1161],{"class":1160},[1050,1169,1170],{"class":1077},",\n",[1050,1172,1174,1177],{"class":1052,"line":1173},10,[1050,1175,1176],{"class":1154},"            fields",[1050,1178,1179],{"class":1077},"=[\n",[1050,1181,1183,1186,1188,1191,1193,1196,1199,1201,1204,1206,1209,1211,1214],{"class":1052,"line":1182},11,[1050,1184,1185],{"class":1077},"                (",[1050,1187,1161],{"class":1160},[1050,1189,1190],{"class":1164},"id",[1050,1192,1161],{"class":1160},[1050,1194,1195],{"class":1077},",",[1050,1197,1198],{"class":1144}," models",[1050,1200,1085],{"class":1077},[1050,1202,1203],{"class":1144},"AutoField",[1050,1205,1078],{"class":1077},[1050,1207,1208],{"class":1154},"primary_key",[1050,1210,1101],{"class":1077},[1050,1212,1213],{"class":1104},"True",[1050,1215,1216],{"class":1077},")),\n",[1050,1218,1220,1222,1224,1227,1229,1231,1233,1235,1238,1240,1243,1245,1249],{"class":1052,"line":1219},12,[1050,1221,1185],{"class":1077},[1050,1223,1161],{"class":1160},[1050,1225,1226],{"class":1164},"title",[1050,1228,1161],{"class":1160},[1050,1230,1195],{"class":1077},[1050,1232,1198],{"class":1144},[1050,1234,1085],{"class":1077},[1050,1236,1237],{"class":1144},"CharField",[1050,1239,1078],{"class":1077},[1050,1241,1242],{"class":1154},"max_length",[1050,1244,1101],{"class":1077},[1050,1246,1248],{"class":1247},"s7CZa","200",[1050,1250,1216],{"class":1077},[1050,1252,1254,1256,1258,1261,1263,1265,1267,1269,1272],{"class":1052,"line":1253},13,[1050,1255,1185],{"class":1077},[1050,1257,1161],{"class":1160},[1050,1259,1260],{"class":1164},"content",[1050,1262,1161],{"class":1160},[1050,1264,1195],{"class":1077},[1050,1266,1198],{"class":1144},[1050,1268,1085],{"class":1077},[1050,1270,1271],{"class":1144},"TextField",[1050,1273,1274],{"class":1077},"()),\n",[1050,1276,1278],{"class":1052,"line":1277},14,[1050,1279,1280],{"class":1077},"            ],\n",[1050,1282,1284],{"class":1052,"line":1283},15,[1050,1285,1286],{"class":1077},"        ),\n",[1050,1288,1290],{"class":1052,"line":1289},16,[1050,1291,1292],{"class":1077},"    ]\n",[1050,1294,1296],{"class":1052,"line":1295},17,[1050,1297,1299],{"emptyLinePlaceholder":1298},true,"\n",[1050,1301,1303],{"class":1052,"line":1302},18,[1050,1304,1305],{"class":1056},"# blog/migrations/0002_add_author.py\n",[1050,1307,1309,1311,1313,1315,1317,1319,1321],{"class":1052,"line":1308},19,[1050,1310,1070],{"class":1069},[1050,1312,1074],{"class":1073},[1050,1314,1078],{"class":1077},[1050,1316,1082],{"class":1081},[1050,1318,1085],{"class":1077},[1050,1320,1088],{"class":1081},[1050,1322,1091],{"class":1077},[1050,1324,1326,1328,1330,1333,1335,1338,1340,1342,1345,1348,1350],{"class":1052,"line":1325},20,[1050,1327,1111],{"class":1097},[1050,1329,1101],{"class":1077},[1050,1331,1332],{"class":1077}," [(",[1050,1334,1161],{"class":1160},[1050,1336,1337],{"class":1164},"blog",[1050,1339,1161],{"class":1160},[1050,1341,1195],{"class":1077},[1050,1343,1344],{"class":1160}," '",[1050,1346,1347],{"class":1164},"0001_initial",[1050,1349,1161],{"class":1160},[1050,1351,1352],{"class":1077},")]\n",[1050,1354,1356],{"class":1052,"line":1355},21,[1050,1357,1122],{"class":1097},[1050,1359,1361,1363,1365],{"class":1052,"line":1360},22,[1050,1362,1128],{"class":1097},[1050,1364,1101],{"class":1077},[1050,1366,1133],{"class":1077},[1050,1368,1370,1372,1374,1377],{"class":1052,"line":1369},23,[1050,1371,1139],{"class":1097},[1050,1373,1085],{"class":1077},[1050,1375,1376],{"class":1144},"AddField",[1050,1378,1148],{"class":1077},[1050,1380,1382,1385,1387,1389,1392,1394],{"class":1052,"line":1381},24,[1050,1383,1384],{"class":1154},"            model_name",[1050,1386,1101],{"class":1077},[1050,1388,1161],{"class":1160},[1050,1390,1391],{"class":1164},"post",[1050,1393,1161],{"class":1160},[1050,1395,1170],{"class":1077},[1050,1397,1399,1401,1403,1405,1408,1410],{"class":1052,"line":1398},25,[1050,1400,1155],{"class":1154},[1050,1402,1101],{"class":1077},[1050,1404,1161],{"class":1160},[1050,1406,1407],{"class":1164},"author",[1050,1409,1161],{"class":1160},[1050,1411,1170],{"class":1077},[1050,1413,1415,1418,1420,1423,1425,1427,1429,1431,1433,1436,1438,1441,1443,1445,1448,1450],{"class":1052,"line":1414},26,[1050,1416,1417],{"class":1154},"            field",[1050,1419,1101],{"class":1077},[1050,1421,1422],{"class":1144},"models",[1050,1424,1085],{"class":1077},[1050,1426,1237],{"class":1144},[1050,1428,1078],{"class":1077},[1050,1430,1242],{"class":1154},[1050,1432,1101],{"class":1077},[1050,1434,1435],{"class":1247},"100",[1050,1437,1195],{"class":1077},[1050,1439,1440],{"class":1154}," default",[1050,1442,1101],{"class":1077},[1050,1444,1161],{"class":1160},[1050,1446,1447],{"class":1164},"Anonymous",[1050,1449,1161],{"class":1160},[1050,1451,1452],{"class":1077},"),\n",[1050,1454,1456],{"class":1052,"line":1455},27,[1050,1457,1286],{"class":1077},[1050,1459,1461],{"class":1052,"line":1460},28,[1050,1462,1292],{"class":1077},[1050,1464,1466],{"class":1052,"line":1465},29,[1050,1467,1299],{"emptyLinePlaceholder":1298},[1050,1469,1471],{"class":1052,"line":1470},30,[1050,1472,1473],{"class":1056},"# blog/migrations/0003_add_created_at.py\n",[1050,1475,1477,1479,1481,1483,1485,1487,1489],{"class":1052,"line":1476},31,[1050,1478,1070],{"class":1069},[1050,1480,1074],{"class":1073},[1050,1482,1078],{"class":1077},[1050,1484,1082],{"class":1081},[1050,1486,1085],{"class":1077},[1050,1488,1088],{"class":1081},[1050,1490,1091],{"class":1077},[1050,1492,1494,1496,1498,1500,1502,1504,1506,1508,1510,1513,1515],{"class":1052,"line":1493},32,[1050,1495,1111],{"class":1097},[1050,1497,1101],{"class":1077},[1050,1499,1332],{"class":1077},[1050,1501,1161],{"class":1160},[1050,1503,1337],{"class":1164},[1050,1505,1161],{"class":1160},[1050,1507,1195],{"class":1077},[1050,1509,1344],{"class":1160},[1050,1511,1512],{"class":1164},"0002_add_author",[1050,1514,1161],{"class":1160},[1050,1516,1352],{"class":1077},[1050,1518,1520],{"class":1052,"line":1519},33,[1050,1521,1122],{"class":1097},[1050,1523,1525,1527,1529],{"class":1052,"line":1524},34,[1050,1526,1128],{"class":1097},[1050,1528,1101],{"class":1077},[1050,1530,1133],{"class":1077},[1050,1532,1534,1536,1538,1540],{"class":1052,"line":1533},35,[1050,1535,1139],{"class":1097},[1050,1537,1085],{"class":1077},[1050,1539,1376],{"class":1144},[1050,1541,1148],{"class":1077},[1050,1543,1545,1547,1549,1551,1553,1555],{"class":1052,"line":1544},36,[1050,1546,1384],{"class":1154},[1050,1548,1101],{"class":1077},[1050,1550,1161],{"class":1160},[1050,1552,1391],{"class":1164},[1050,1554,1161],{"class":1160},[1050,1556,1170],{"class":1077},[1050,1558,1560,1562,1564,1566,1569,1571],{"class":1052,"line":1559},37,[1050,1561,1155],{"class":1154},[1050,1563,1101],{"class":1077},[1050,1565,1161],{"class":1160},[1050,1567,1568],{"class":1164},"created_at",[1050,1570,1161],{"class":1160},[1050,1572,1170],{"class":1077},[1050,1574,1576,1578,1580,1582,1584,1587,1589,1592,1594,1596,1598,1600,1602,1605,1607,1611],{"class":1052,"line":1575},38,[1050,1577,1417],{"class":1154},[1050,1579,1101],{"class":1077},[1050,1581,1422],{"class":1144},[1050,1583,1085],{"class":1077},[1050,1585,1586],{"class":1144},"DateTimeField",[1050,1588,1078],{"class":1077},[1050,1590,1591],{"class":1154},"auto_now_add",[1050,1593,1101],{"class":1077},[1050,1595,1213],{"class":1104},[1050,1597,1195],{"class":1077},[1050,1599,1440],{"class":1154},[1050,1601,1101],{"class":1077},[1050,1603,1604],{"class":1144},"timezone",[1050,1606,1085],{"class":1077},[1050,1608,1610],{"class":1609},"sBPpx","now",[1050,1612,1452],{"class":1077},[1050,1614,1616,1619,1621,1624],{"class":1052,"line":1615},39,[1050,1617,1618],{"class":1154},"            preserve_default",[1050,1620,1101],{"class":1077},[1050,1622,1623],{"class":1104},"False",[1050,1625,1170],{"class":1077},[1050,1627,1629],{"class":1052,"line":1628},40,[1050,1630,1286],{"class":1077},[1050,1632,1634],{"class":1052,"line":1633},41,[1050,1635,1292],{"class":1077},[1050,1637,1639],{"class":1052,"line":1638},42,[1050,1640,1299],{"emptyLinePlaceholder":1298},[1050,1642,1644],{"class":1052,"line":1643},43,[1050,1645,1646],{"class":1056},"# blog/migrations/0004_add_status.py\n",[1050,1648,1650,1652,1654,1656,1658,1660,1662],{"class":1052,"line":1649},44,[1050,1651,1070],{"class":1069},[1050,1653,1074],{"class":1073},[1050,1655,1078],{"class":1077},[1050,1657,1082],{"class":1081},[1050,1659,1085],{"class":1077},[1050,1661,1088],{"class":1081},[1050,1663,1091],{"class":1077},[1050,1665,1667,1669,1671,1673,1675,1677,1679,1681,1683,1686,1688],{"class":1052,"line":1666},45,[1050,1668,1111],{"class":1097},[1050,1670,1101],{"class":1077},[1050,1672,1332],{"class":1077},[1050,1674,1161],{"class":1160},[1050,1676,1337],{"class":1164},[1050,1678,1161],{"class":1160},[1050,1680,1195],{"class":1077},[1050,1682,1344],{"class":1160},[1050,1684,1685],{"class":1164},"0003_add_created_at",[1050,1687,1161],{"class":1160},[1050,1689,1352],{"class":1077},[1050,1691,1693],{"class":1052,"line":1692},46,[1050,1694,1122],{"class":1097},[1050,1696,1698,1700,1702],{"class":1052,"line":1697},47,[1050,1699,1128],{"class":1097},[1050,1701,1101],{"class":1077},[1050,1703,1133],{"class":1077},[1050,1705,1707,1709,1711,1713],{"class":1052,"line":1706},48,[1050,1708,1139],{"class":1097},[1050,1710,1085],{"class":1077},[1050,1712,1376],{"class":1144},[1050,1714,1148],{"class":1077},[1050,1716,1718,1720,1722,1724,1726,1728],{"class":1052,"line":1717},49,[1050,1719,1384],{"class":1154},[1050,1721,1101],{"class":1077},[1050,1723,1161],{"class":1160},[1050,1725,1391],{"class":1164},[1050,1727,1161],{"class":1160},[1050,1729,1170],{"class":1077},[1050,1731,1733,1735,1737,1739,1742,1744],{"class":1052,"line":1732},50,[1050,1734,1155],{"class":1154},[1050,1736,1101],{"class":1077},[1050,1738,1161],{"class":1160},[1050,1740,1741],{"class":1164},"status",[1050,1743,1161],{"class":1160},[1050,1745,1170],{"class":1077},[1050,1747,1749,1751,1753,1755,1757,1759,1761,1763,1765,1768,1770,1772,1774,1776,1779,1781],{"class":1052,"line":1748},51,[1050,1750,1417],{"class":1154},[1050,1752,1101],{"class":1077},[1050,1754,1422],{"class":1144},[1050,1756,1085],{"class":1077},[1050,1758,1237],{"class":1144},[1050,1760,1078],{"class":1077},[1050,1762,1242],{"class":1154},[1050,1764,1101],{"class":1077},[1050,1766,1767],{"class":1247},"20",[1050,1769,1195],{"class":1077},[1050,1771,1440],{"class":1154},[1050,1773,1101],{"class":1077},[1050,1775,1161],{"class":1160},[1050,1777,1778],{"class":1164},"draft",[1050,1780,1161],{"class":1160},[1050,1782,1452],{"class":1077},[1050,1784,1786],{"class":1052,"line":1785},52,[1050,1787,1286],{"class":1077},[1050,1789,1791],{"class":1052,"line":1790},53,[1050,1792,1292],{"class":1077},[1050,1794,1796],{"class":1052,"line":1795},54,[1050,1797,1299],{"emptyLinePlaceholder":1298},[1050,1799,1801],{"class":1052,"line":1800},55,[1050,1802,1803],{"class":1056},"# After squashing: Single optimized migration\n",[1050,1805,1807],{"class":1052,"line":1806},56,[1050,1808,1809],{"class":1056},"# Command: python manage.py squashmigrations blog 0001 0004\n",[1050,1811,1813],{"class":1052,"line":1812},57,[1050,1814,1815],{"class":1056},"# Generated: blog/migrations/0001_squashed_0001_0004_initial.py\n",[1050,1817,1819],{"class":1052,"line":1818},58,[1050,1820,1299],{"emptyLinePlaceholder":1298},[1050,1822,1824,1826,1828,1830,1832,1834,1836],{"class":1052,"line":1823},59,[1050,1825,1070],{"class":1069},[1050,1827,1074],{"class":1073},[1050,1829,1078],{"class":1077},[1050,1831,1082],{"class":1081},[1050,1833,1085],{"class":1077},[1050,1835,1088],{"class":1081},[1050,1837,1091],{"class":1077},[1050,1839,1841,1845,1849],{"class":1052,"line":1840},60,[1050,1842,1844],{"class":1843},"sm7ve","    \"\"\"",[1050,1846,1848],{"class":1847},"sVyVU","Squashed migration combining 0001-0004",[1050,1850,1851],{"class":1843},"\"\"\"\n",[1050,1853,1855],{"class":1052,"line":1854},61,[1050,1856,1122],{"class":1097},[1050,1858,1860,1862,1864],{"class":1052,"line":1859},62,[1050,1861,1098],{"class":1097},[1050,1863,1101],{"class":1077},[1050,1865,1105],{"class":1104},[1050,1867,1869],{"class":1052,"line":1868},63,[1050,1870,1122],{"class":1097},[1050,1872,1874,1876,1878],{"class":1052,"line":1873},64,[1050,1875,1111],{"class":1097},[1050,1877,1101],{"class":1077},[1050,1879,1116],{"class":1077},[1050,1881,1883],{"class":1052,"line":1882},65,[1050,1884,1122],{"class":1097},[1050,1886,1888],{"class":1052,"line":1887},66,[1050,1889,1890],{"class":1056},"    # List of migrations this squashed migration replaces\n",[1050,1892,1894,1897,1899],{"class":1052,"line":1893},67,[1050,1895,1896],{"class":1097},"    replaces ",[1050,1898,1101],{"class":1077},[1050,1900,1133],{"class":1077},[1050,1902,1904,1907,1909,1911,1913,1915,1917,1919,1921],{"class":1052,"line":1903},68,[1050,1905,1906],{"class":1077},"        (",[1050,1908,1161],{"class":1160},[1050,1910,1337],{"class":1164},[1050,1912,1161],{"class":1160},[1050,1914,1195],{"class":1077},[1050,1916,1344],{"class":1160},[1050,1918,1347],{"class":1164},[1050,1920,1161],{"class":1160},[1050,1922,1452],{"class":1077},[1050,1924,1926,1928,1930,1932,1934,1936,1938,1940,1942],{"class":1052,"line":1925},69,[1050,1927,1906],{"class":1077},[1050,1929,1161],{"class":1160},[1050,1931,1337],{"class":1164},[1050,1933,1161],{"class":1160},[1050,1935,1195],{"class":1077},[1050,1937,1344],{"class":1160},[1050,1939,1512],{"class":1164},[1050,1941,1161],{"class":1160},[1050,1943,1452],{"class":1077},[1050,1945,1947,1949,1951,1953,1955,1957,1959,1961,1963],{"class":1052,"line":1946},70,[1050,1948,1906],{"class":1077},[1050,1950,1161],{"class":1160},[1050,1952,1337],{"class":1164},[1050,1954,1161],{"class":1160},[1050,1956,1195],{"class":1077},[1050,1958,1344],{"class":1160},[1050,1960,1685],{"class":1164},[1050,1962,1161],{"class":1160},[1050,1964,1452],{"class":1077},[1050,1966,1968,1970,1972,1974,1976,1978,1980,1983,1985],{"class":1052,"line":1967},71,[1050,1969,1906],{"class":1077},[1050,1971,1161],{"class":1160},[1050,1973,1337],{"class":1164},[1050,1975,1161],{"class":1160},[1050,1977,1195],{"class":1077},[1050,1979,1344],{"class":1160},[1050,1981,1982],{"class":1164},"0004_add_status",[1050,1984,1161],{"class":1160},[1050,1986,1452],{"class":1077},[1050,1988,1990],{"class":1052,"line":1989},72,[1050,1991,1292],{"class":1077},[1050,1993,1995],{"class":1052,"line":1994},73,[1050,1996,1122],{"class":1097},[1050,1998,2000,2002,2004],{"class":1052,"line":1999},74,[1050,2001,1128],{"class":1097},[1050,2003,1101],{"class":1077},[1050,2005,1133],{"class":1077},[1050,2007,2009],{"class":1052,"line":2008},75,[1050,2010,2011],{"class":1056},"        # Optimized: Create model with all fields at once\n",[1050,2013,2015,2017,2019,2021],{"class":1052,"line":2014},76,[1050,2016,1139],{"class":1097},[1050,2018,1085],{"class":1077},[1050,2020,1145],{"class":1144},[1050,2022,1148],{"class":1077},[1050,2024,2026,2028,2030,2032,2034,2036],{"class":1052,"line":2025},77,[1050,2027,1155],{"class":1154},[1050,2029,1101],{"class":1077},[1050,2031,1161],{"class":1160},[1050,2033,1165],{"class":1164},[1050,2035,1161],{"class":1160},[1050,2037,1170],{"class":1077},[1050,2039,2041,2043],{"class":1052,"line":2040},78,[1050,2042,1176],{"class":1154},[1050,2044,1179],{"class":1077},[1050,2046,2048,2050,2052,2054,2056,2058,2060,2062,2064,2066,2068,2070,2072],{"class":1052,"line":2047},79,[1050,2049,1185],{"class":1077},[1050,2051,1161],{"class":1160},[1050,2053,1190],{"class":1164},[1050,2055,1161],{"class":1160},[1050,2057,1195],{"class":1077},[1050,2059,1198],{"class":1144},[1050,2061,1085],{"class":1077},[1050,2063,1203],{"class":1144},[1050,2065,1078],{"class":1077},[1050,2067,1208],{"class":1154},[1050,2069,1101],{"class":1077},[1050,2071,1213],{"class":1104},[1050,2073,1216],{"class":1077},[1050,2075,2077,2079,2081,2083,2085,2087,2089,2091,2093,2095,2097,2099,2101],{"class":1052,"line":2076},80,[1050,2078,1185],{"class":1077},[1050,2080,1161],{"class":1160},[1050,2082,1226],{"class":1164},[1050,2084,1161],{"class":1160},[1050,2086,1195],{"class":1077},[1050,2088,1198],{"class":1144},[1050,2090,1085],{"class":1077},[1050,2092,1237],{"class":1144},[1050,2094,1078],{"class":1077},[1050,2096,1242],{"class":1154},[1050,2098,1101],{"class":1077},[1050,2100,1248],{"class":1247},[1050,2102,1216],{"class":1077},[1050,2104,2106,2108,2110,2112,2114,2116,2118,2120,2122],{"class":1052,"line":2105},81,[1050,2107,1185],{"class":1077},[1050,2109,1161],{"class":1160},[1050,2111,1260],{"class":1164},[1050,2113,1161],{"class":1160},[1050,2115,1195],{"class":1077},[1050,2117,1198],{"class":1144},[1050,2119,1085],{"class":1077},[1050,2121,1271],{"class":1144},[1050,2123,1274],{"class":1077},[1050,2125,2127,2129,2131,2133,2135,2137,2139,2141,2143,2145,2147,2149,2151,2153,2155,2157,2159,2161,2163],{"class":1052,"line":2126},82,[1050,2128,1185],{"class":1077},[1050,2130,1161],{"class":1160},[1050,2132,1407],{"class":1164},[1050,2134,1161],{"class":1160},[1050,2136,1195],{"class":1077},[1050,2138,1198],{"class":1144},[1050,2140,1085],{"class":1077},[1050,2142,1237],{"class":1144},[1050,2144,1078],{"class":1077},[1050,2146,1242],{"class":1154},[1050,2148,1101],{"class":1077},[1050,2150,1435],{"class":1247},[1050,2152,1195],{"class":1077},[1050,2154,1440],{"class":1154},[1050,2156,1101],{"class":1077},[1050,2158,1161],{"class":1160},[1050,2160,1447],{"class":1164},[1050,2162,1161],{"class":1160},[1050,2164,1216],{"class":1077},[1050,2166,2168,2170,2172,2174,2176,2178,2180,2182,2184,2186,2188,2190,2192],{"class":1052,"line":2167},83,[1050,2169,1185],{"class":1077},[1050,2171,1161],{"class":1160},[1050,2173,1568],{"class":1164},[1050,2175,1161],{"class":1160},[1050,2177,1195],{"class":1077},[1050,2179,1198],{"class":1144},[1050,2181,1085],{"class":1077},[1050,2183,1586],{"class":1144},[1050,2185,1078],{"class":1077},[1050,2187,1591],{"class":1154},[1050,2189,1101],{"class":1077},[1050,2191,1213],{"class":1104},[1050,2193,1216],{"class":1077},[1050,2195,2197,2199,2201,2203,2205,2207,2209,2211,2213,2215,2217,2219,2221,2223,2225,2227,2229,2231,2233],{"class":1052,"line":2196},84,[1050,2198,1185],{"class":1077},[1050,2200,1161],{"class":1160},[1050,2202,1741],{"class":1164},[1050,2204,1161],{"class":1160},[1050,2206,1195],{"class":1077},[1050,2208,1198],{"class":1144},[1050,2210,1085],{"class":1077},[1050,2212,1237],{"class":1144},[1050,2214,1078],{"class":1077},[1050,2216,1242],{"class":1154},[1050,2218,1101],{"class":1077},[1050,2220,1767],{"class":1247},[1050,2222,1195],{"class":1077},[1050,2224,1440],{"class":1154},[1050,2226,1101],{"class":1077},[1050,2228,1161],{"class":1160},[1050,2230,1778],{"class":1164},[1050,2232,1161],{"class":1160},[1050,2234,1216],{"class":1077},[1050,2236,2238],{"class":1052,"line":2237},85,[1050,2239,1280],{"class":1077},[1050,2241,2243],{"class":1052,"line":2242},86,[1050,2244,1286],{"class":1077},[1050,2246,2248],{"class":1052,"line":2247},87,[1050,2249,1292],{"class":1077},[1050,2251,2253],{"class":1052,"line":2252},88,[1050,2254,1299],{"emptyLinePlaceholder":1298},[1050,2256,2258],{"class":1052,"line":2257},89,[1050,2259,2260],{"class":1056},"# Basic squashing command\n",[1050,2262,2264],{"class":1052,"line":2263},90,[1050,2265,2266],{"class":1056},"# python manage.py squashmigrations app_name start_migration end_migration\n",[1050,2268,2270],{"class":1052,"line":2269},91,[1050,2271,1299],{"emptyLinePlaceholder":1298},[1050,2273,2275],{"class":1052,"line":2274},92,[1050,2276,2277],{"class":1056},"# Examples:\n",[1050,2279,2281],{"class":1052,"line":2280},93,[1050,2282,2283],{"class":1056},"# python manage.py squashmigrations blog 0001 0004\n",[1050,2285,2287],{"class":1052,"line":2286},94,[1050,2288,2289],{"class":1056},"# python manage.py squashmigrations blog 0005 0010 --squashed-name combined_features\n",[1035,2291,2293],{"id":2292},"when-to-squash-migrations","When to Squash Migrations",[1040,2295,2297],{"className":1042,"code":2296,"language":1044,"meta":1045,"style":1045},"class MigrationSquashingAnalyzer:\n    \"\"\"Analyze when migrations should be squashed\"\"\"\n    \n    def __init__(self, app_label):\n        self.app_label = app_label\n        from django.db.migrations.loader import MigrationLoader\n        self.loader = MigrationLoader(connection)\n    \n    def analyze_squashing_candidates(self):\n        \"\"\"Identify migrations that are good candidates for squashing\"\"\"\n        \n        analysis = {\n            'total_migrations': 0,\n            'squashing_opportunities': [],\n            'recommendations': []\n        }\n        \n        # Get all migrations for the app\n        app_migrations = []\n        \n        for migration_key in self.loader.graph.nodes:\n            if migration_key[0] == self.app_label:\n                app_migrations.append(migration_key[1])\n        \n        app_migrations.sort()\n        analysis['total_migrations'] = len(app_migrations)\n        \n        # Analyze migration patterns\n        if len(app_migrations) > 20:\n            analysis['recommendations'].append(\n                f\"App has {len(app_migrations)} migrations - consider squashing older migrations\"\n            )\n        \n        # Look for sequences of related migrations\n        sequences = self._find_migration_sequences(app_migrations)\n        \n        for sequence in sequences:\n            if len(sequence) >= 5:\n                analysis['squashing_opportunities'].append({\n                    'start_migration': sequence[0],\n                    'end_migration': sequence[-1],\n                    'migration_count': len(sequence),\n                    'reason': 'Long sequence of related migrations'\n                })\n        \n        # Look for old migrations that are safe to squash\n        if len(app_migrations) > 10:\n            # Suggest squashing first 5-10 migrations if they're old enough\n            old_migrations = app_migrations[:10]\n            \n            analysis['squashing_opportunities'].append({\n                'start_migration': old_migrations[0],\n                'end_migration': old_migrations[-1],\n                'migration_count': len(old_migrations),\n                'reason': 'Old migrations that can be safely combined'\n            })\n        \n        return analysis\n    \n    def _find_migration_sequences(self, migrations):\n        \"\"\"Find sequences of migrations that modify the same models\"\"\"\n        \n        sequences = []\n        current_sequence = []\n        \n        for migration_name in migrations:\n            migration = self.loader.get_migration(self.app_label, migration_name)\n            \n            # Analyze operations to see if they're related to previous migration\n            if self._is_related_to_sequence(migration, current_sequence):\n                current_sequence.append(migration_name)\n            else:\n                if len(current_sequence) > 1:\n                    sequences.append(current_sequence)\n                current_sequence = [migration_name]\n        \n        # Add final sequence\n        if len(current_sequence) > 1:\n            sequences.append(current_sequence)\n        \n        return sequences\n    \n    def _is_related_to_sequence(self, migration, current_sequence):\n        \"\"\"Check if migration is related to current sequence\"\"\"\n        \n        if not current_sequence:\n            return True\n        \n        # Get models affected by this migration\n        affected_models = set()\n        \n        for operation in migration.operations:\n            if hasattr(operation, 'model_name'):\n                affected_models.add(operation.model_name.lower())\n            elif hasattr(operation, 'name'):\n                affected_models.add(operation.name.lower())\n        \n        # Check if it affects similar models to recent migrations in sequence\n        # This is a simplified heuristic\n        return len(affected_models) > 0\n    \n    def check_squashing_safety(self, start_migration, end_migration):\n        \"\"\"Check if it's safe to squash a range of migrations\"\"\"\n        \n        safety_check = {\n            'safe_to_squash': True,\n            'warnings': [],\n            'blocking_issues': []\n        }\n        \n        # Get migrations in range\n        app_migrations = []\n        \n        for migration_key in self.loader.graph.nodes:\n            if migration_key[0] == self.app_label:\n                app_migrations.append(migration_key[1])\n        \n        app_migrations.sort()\n        \n        try:\n            start_idx = app_migrations.index(start_migration)\n            end_idx = app_migrations.index(end_migration)\n        except ValueError:\n            safety_check['safe_to_squash'] = False\n            safety_check['blocking_issues'].append(\"Invalid migration range\")\n            return safety_check\n        \n        migrations_to_squash = app_migrations[start_idx:end_idx + 1]\n        \n        # Check for complex operations\n        for migration_name in migrations_to_squash:\n            migration = self.loader.get_migration(self.app_label, migration_name)\n            \n            for operation in migration.operations:\n                op_name = operation.__class__.__name__\n                \n                # Check for operations that might not squash well\n                if op_name == 'RunPython':\n                    safety_check['warnings'].append(\n                        f\"Migration {migration_name} contains RunPython operation\"\n                    )\n                \n                elif op_name == 'RunSQL':\n                    safety_check['warnings'].append(\n                        f\"Migration {migration_name} contains RunSQL operation\"\n                    )\n                \n                elif op_name in ['RemoveField', 'DeleteModel']:\n                    safety_check['warnings'].append(\n                        f\"Migration {migration_name} contains destructive operation: {op_name}\"\n                    )\n        \n        # Check for external dependencies\n        for migration_name in migrations_to_squash:\n            migration = self.loader.get_migration(self.app_label, migration_name)\n            \n            for dep_app, dep_migration in migration.dependencies:\n                if dep_app != self.app_label:\n                    safety_check['warnings'].append(\n                        f\"Migration {migration_name} depends on external app: {dep_app}.{dep_migration}\"\n                    )\n        \n        return safety_check\n",[1047,2298,2299,2309,2318,2322,2345,2362,2391,2413,2417,2431,2441,2446,2456,2474,2488,2501,2506,2510,2515,2524,2528,2558,2587,2610,2614,2627,2654,2658,2663,2685,2705,2732,2737,2741,2746,2766,2770,2784,2805,2825,2847,2869,2888,2907,2912,2916,2921,2940,2945,2964,2969,2987,3007,3027,3046,3063,3068,3072,3080,3084,3102,3111,3115,3123,3132,3136,3149,3182,3186,3191,3214,3230,3237,3258,3273,3287,3291,3296,3314,3329,3333,3340,3344,3366,3375,3379,3390,3397,3401,3406,3419,3423,3441,3464,3490,3513,3536,3541,3547,3553,3572,3577,3601,3611,3616,3626,3643,3657,3671,3676,3681,3687,3696,3701,3726,3749,3768,3773,3784,3789,3797,3818,3838,3849,3870,3899,3907,3912,3939,3944,3950,3964,3995,4000,4018,4040,4046,4052,4072,4092,4110,4116,4121,4140,4159,4175,4180,4185,4215,4234,4260,4265,4270,4276,4289,4320,4325,4349,4368,4387,4421,4426,4431],{"__ignoreMap":1045},[1050,2300,2301,2303,2306],{"class":1052,"line":1053},[1050,2302,1070],{"class":1069},[1050,2304,2305],{"class":1073}," MigrationSquashingAnalyzer",[1050,2307,2308],{"class":1077},":\n",[1050,2310,2311,2313,2316],{"class":1052,"line":1060},[1050,2312,1844],{"class":1843},[1050,2314,2315],{"class":1847},"Analyze when migrations should be squashed",[1050,2317,1851],{"class":1843},[1050,2319,2320],{"class":1052,"line":1066},[1050,2321,1122],{"class":1097},[1050,2323,2324,2327,2331,2333,2337,2339,2343],{"class":1052,"line":1094},[1050,2325,2326],{"class":1069},"    def",[1050,2328,2330],{"class":2329},"sJdAF"," __init__",[1050,2332,1078],{"class":1077},[1050,2334,2336],{"class":2335},"sRjD_","self",[1050,2338,1195],{"class":1077},[1050,2340,2342],{"class":2341},"sCyAa"," app_label",[1050,2344,1091],{"class":1077},[1050,2346,2347,2351,2353,2356,2359],{"class":1052,"line":1108},[1050,2348,2350],{"class":2349},"se3Ec","        self",[1050,2352,1085],{"class":1077},[1050,2354,2355],{"class":1609},"app_label",[1050,2357,2358],{"class":1077}," =",[1050,2360,2361],{"class":1097}," app_label\n",[1050,2363,2364,2368,2371,2373,2376,2378,2380,2382,2385,2388],{"class":1052,"line":1119},[1050,2365,2367],{"class":2366},"siDh9","        from",[1050,2369,2370],{"class":1097}," django",[1050,2372,1085],{"class":1077},[1050,2374,2375],{"class":1097},"db",[1050,2377,1085],{"class":1077},[1050,2379,1082],{"class":1097},[1050,2381,1085],{"class":1077},[1050,2383,2384],{"class":1097},"loader ",[1050,2386,2387],{"class":2366},"import",[1050,2389,2390],{"class":1097}," MigrationLoader\n",[1050,2392,2393,2395,2397,2400,2402,2405,2407,2410],{"class":1052,"line":1125},[1050,2394,2350],{"class":2349},[1050,2396,1085],{"class":1077},[1050,2398,2399],{"class":1609},"loader",[1050,2401,2358],{"class":1077},[1050,2403,2404],{"class":1144}," MigrationLoader",[1050,2406,1078],{"class":1077},[1050,2408,2409],{"class":1144},"connection",[1050,2411,2412],{"class":1077},")\n",[1050,2414,2415],{"class":1052,"line":1136},[1050,2416,1122],{"class":1097},[1050,2418,2419,2421,2425,2427,2429],{"class":1052,"line":1151},[1050,2420,2326],{"class":1069},[1050,2422,2424],{"class":2423},"sljsM"," analyze_squashing_candidates",[1050,2426,1078],{"class":1077},[1050,2428,2336],{"class":2335},[1050,2430,1091],{"class":1077},[1050,2432,2433,2436,2439],{"class":1052,"line":1173},[1050,2434,2435],{"class":1843},"        \"\"\"",[1050,2437,2438],{"class":1847},"Identify migrations that are good candidates for squashing",[1050,2440,1851],{"class":1843},[1050,2442,2443],{"class":1052,"line":1182},[1050,2444,2445],{"class":1097},"        \n",[1050,2447,2448,2451,2453],{"class":1052,"line":1219},[1050,2449,2450],{"class":1097},"        analysis ",[1050,2452,1101],{"class":1077},[1050,2454,2455],{"class":1077}," {\n",[1050,2457,2458,2461,2464,2466,2469,2472],{"class":1052,"line":1253},[1050,2459,2460],{"class":1160},"            '",[1050,2462,2463],{"class":1164},"total_migrations",[1050,2465,1161],{"class":1160},[1050,2467,2468],{"class":1077},":",[1050,2470,2471],{"class":1247}," 0",[1050,2473,1170],{"class":1077},[1050,2475,2476,2478,2481,2483,2485],{"class":1052,"line":1277},[1050,2477,2460],{"class":1160},[1050,2479,2480],{"class":1164},"squashing_opportunities",[1050,2482,1161],{"class":1160},[1050,2484,2468],{"class":1077},[1050,2486,2487],{"class":1077}," [],\n",[1050,2489,2490,2492,2495,2497,2499],{"class":1052,"line":1283},[1050,2491,2460],{"class":1160},[1050,2493,2494],{"class":1164},"recommendations",[1050,2496,1161],{"class":1160},[1050,2498,2468],{"class":1077},[1050,2500,1116],{"class":1077},[1050,2502,2503],{"class":1052,"line":1289},[1050,2504,2505],{"class":1077},"        }\n",[1050,2507,2508],{"class":1052,"line":1295},[1050,2509,2445],{"class":1097},[1050,2511,2512],{"class":1052,"line":1302},[1050,2513,2514],{"class":1056},"        # Get all migrations for the app\n",[1050,2516,2517,2520,2522],{"class":1052,"line":1308},[1050,2518,2519],{"class":1097},"        app_migrations ",[1050,2521,1101],{"class":1077},[1050,2523,1116],{"class":1077},[1050,2525,2526],{"class":1052,"line":1325},[1050,2527,2445],{"class":1097},[1050,2529,2530,2533,2536,2539,2542,2544,2546,2548,2551,2553,2556],{"class":1052,"line":1355},[1050,2531,2532],{"class":2366},"        for",[1050,2534,2535],{"class":1097}," migration_key ",[1050,2537,2538],{"class":2366},"in",[1050,2540,2541],{"class":2349}," self",[1050,2543,1085],{"class":1077},[1050,2545,2399],{"class":1609},[1050,2547,1085],{"class":1077},[1050,2549,2550],{"class":1609},"graph",[1050,2552,1085],{"class":1077},[1050,2554,2555],{"class":1609},"nodes",[1050,2557,2308],{"class":1077},[1050,2559,2560,2563,2566,2569,2572,2575,2579,2581,2583,2585],{"class":1052,"line":1360},[1050,2561,2562],{"class":2366},"            if",[1050,2564,2565],{"class":1097}," migration_key",[1050,2567,2568],{"class":1077},"[",[1050,2570,2571],{"class":1247},"0",[1050,2573,2574],{"class":1077},"]",[1050,2576,2578],{"class":2577},"sVsLi"," ==",[1050,2580,2541],{"class":2349},[1050,2582,1085],{"class":1077},[1050,2584,2355],{"class":1609},[1050,2586,2308],{"class":1077},[1050,2588,2589,2592,2594,2597,2599,2602,2604,2607],{"class":1052,"line":1369},[1050,2590,2591],{"class":1097},"                app_migrations",[1050,2593,1085],{"class":1077},[1050,2595,2596],{"class":1144},"append",[1050,2598,1078],{"class":1077},[1050,2600,2601],{"class":1144},"migration_key",[1050,2603,2568],{"class":1077},[1050,2605,2606],{"class":1247},"1",[1050,2608,2609],{"class":1077},"])\n",[1050,2611,2612],{"class":1052,"line":1381},[1050,2613,2445],{"class":1097},[1050,2615,2616,2619,2621,2624],{"class":1052,"line":1398},[1050,2617,2618],{"class":1097},"        app_migrations",[1050,2620,1085],{"class":1077},[1050,2622,2623],{"class":1144},"sort",[1050,2625,2626],{"class":1077},"()\n",[1050,2628,2629,2632,2634,2636,2638,2640,2642,2644,2647,2649,2652],{"class":1052,"line":1414},[1050,2630,2631],{"class":1097},"        analysis",[1050,2633,2568],{"class":1077},[1050,2635,1161],{"class":1160},[1050,2637,2463],{"class":1164},[1050,2639,1161],{"class":1160},[1050,2641,2574],{"class":1077},[1050,2643,2358],{"class":1077},[1050,2645,2646],{"class":2329}," len",[1050,2648,1078],{"class":1077},[1050,2650,2651],{"class":1144},"app_migrations",[1050,2653,2412],{"class":1077},[1050,2655,2656],{"class":1052,"line":1455},[1050,2657,2445],{"class":1097},[1050,2659,2660],{"class":1052,"line":1460},[1050,2661,2662],{"class":1056},"        # Analyze migration patterns\n",[1050,2664,2665,2668,2670,2672,2674,2677,2680,2683],{"class":1052,"line":1465},[1050,2666,2667],{"class":2366},"        if",[1050,2669,2646],{"class":2329},[1050,2671,1078],{"class":1077},[1050,2673,2651],{"class":1144},[1050,2675,2676],{"class":1077},")",[1050,2678,2679],{"class":2577}," >",[1050,2681,2682],{"class":1247}," 20",[1050,2684,2308],{"class":1077},[1050,2686,2687,2690,2692,2694,2696,2698,2701,2703],{"class":1052,"line":1470},[1050,2688,2689],{"class":1097},"            analysis",[1050,2691,2568],{"class":1077},[1050,2693,1161],{"class":1160},[1050,2695,2494],{"class":1164},[1050,2697,1161],{"class":1160},[1050,2699,2700],{"class":1077},"].",[1050,2702,2596],{"class":1144},[1050,2704,1148],{"class":1077},[1050,2706,2707,2710,2713,2717,2720,2722,2724,2726,2729],{"class":1052,"line":1476},[1050,2708,2709],{"class":1069},"                f",[1050,2711,2712],{"class":1164},"\"App has ",[1050,2714,2716],{"class":2715},"s3h35","{",[1050,2718,2719],{"class":2329},"len",[1050,2721,1078],{"class":1077},[1050,2723,2651],{"class":1144},[1050,2725,2676],{"class":1077},[1050,2727,2728],{"class":2715},"}",[1050,2730,2731],{"class":1164}," migrations - consider squashing older migrations\"\n",[1050,2733,2734],{"class":1052,"line":1493},[1050,2735,2736],{"class":1077},"            )\n",[1050,2738,2739],{"class":1052,"line":1519},[1050,2740,2445],{"class":1097},[1050,2742,2743],{"class":1052,"line":1524},[1050,2744,2745],{"class":1056},"        # Look for sequences of related migrations\n",[1050,2747,2748,2751,2753,2755,2757,2760,2762,2764],{"class":1052,"line":1533},[1050,2749,2750],{"class":1097},"        sequences ",[1050,2752,1101],{"class":1077},[1050,2754,2541],{"class":2349},[1050,2756,1085],{"class":1077},[1050,2758,2759],{"class":1144},"_find_migration_sequences",[1050,2761,1078],{"class":1077},[1050,2763,2651],{"class":1144},[1050,2765,2412],{"class":1077},[1050,2767,2768],{"class":1052,"line":1544},[1050,2769,2445],{"class":1097},[1050,2771,2772,2774,2777,2779,2782],{"class":1052,"line":1559},[1050,2773,2532],{"class":2366},[1050,2775,2776],{"class":1097}," sequence ",[1050,2778,2538],{"class":2366},[1050,2780,2781],{"class":1097}," sequences",[1050,2783,2308],{"class":1077},[1050,2785,2786,2788,2790,2792,2795,2797,2800,2803],{"class":1052,"line":1575},[1050,2787,2562],{"class":2366},[1050,2789,2646],{"class":2329},[1050,2791,1078],{"class":1077},[1050,2793,2794],{"class":1144},"sequence",[1050,2796,2676],{"class":1077},[1050,2798,2799],{"class":2577}," >=",[1050,2801,2802],{"class":1247}," 5",[1050,2804,2308],{"class":1077},[1050,2806,2807,2810,2812,2814,2816,2818,2820,2822],{"class":1052,"line":1615},[1050,2808,2809],{"class":1097},"                analysis",[1050,2811,2568],{"class":1077},[1050,2813,1161],{"class":1160},[1050,2815,2480],{"class":1164},[1050,2817,1161],{"class":1160},[1050,2819,2700],{"class":1077},[1050,2821,2596],{"class":1144},[1050,2823,2824],{"class":1077},"({\n",[1050,2826,2827,2830,2833,2835,2837,2840,2842,2844],{"class":1052,"line":1628},[1050,2828,2829],{"class":1160},"                    '",[1050,2831,2832],{"class":1164},"start_migration",[1050,2834,1161],{"class":1160},[1050,2836,2468],{"class":1077},[1050,2838,2839],{"class":1144}," sequence",[1050,2841,2568],{"class":1077},[1050,2843,2571],{"class":1247},[1050,2845,2846],{"class":1077},"],\n",[1050,2848,2849,2851,2854,2856,2858,2860,2862,2865,2867],{"class":1052,"line":1633},[1050,2850,2829],{"class":1160},[1050,2852,2853],{"class":1164},"end_migration",[1050,2855,1161],{"class":1160},[1050,2857,2468],{"class":1077},[1050,2859,2839],{"class":1144},[1050,2861,2568],{"class":1077},[1050,2863,2864],{"class":2577},"-",[1050,2866,2606],{"class":1247},[1050,2868,2846],{"class":1077},[1050,2870,2871,2873,2876,2878,2880,2882,2884,2886],{"class":1052,"line":1638},[1050,2872,2829],{"class":1160},[1050,2874,2875],{"class":1164},"migration_count",[1050,2877,1161],{"class":1160},[1050,2879,2468],{"class":1077},[1050,2881,2646],{"class":2329},[1050,2883,1078],{"class":1077},[1050,2885,2794],{"class":1144},[1050,2887,1452],{"class":1077},[1050,2889,2890,2892,2895,2897,2899,2901,2904],{"class":1052,"line":1643},[1050,2891,2829],{"class":1160},[1050,2893,2894],{"class":1164},"reason",[1050,2896,1161],{"class":1160},[1050,2898,2468],{"class":1077},[1050,2900,1344],{"class":1160},[1050,2902,2903],{"class":1164},"Long sequence of related migrations",[1050,2905,2906],{"class":1160},"'\n",[1050,2908,2909],{"class":1052,"line":1649},[1050,2910,2911],{"class":1077},"                })\n",[1050,2913,2914],{"class":1052,"line":1666},[1050,2915,2445],{"class":1097},[1050,2917,2918],{"class":1052,"line":1692},[1050,2919,2920],{"class":1056},"        # Look for old migrations that are safe to squash\n",[1050,2922,2923,2925,2927,2929,2931,2933,2935,2938],{"class":1052,"line":1697},[1050,2924,2667],{"class":2366},[1050,2926,2646],{"class":2329},[1050,2928,1078],{"class":1077},[1050,2930,2651],{"class":1144},[1050,2932,2676],{"class":1077},[1050,2934,2679],{"class":2577},[1050,2936,2937],{"class":1247}," 10",[1050,2939,2308],{"class":1077},[1050,2941,2942],{"class":1052,"line":1706},[1050,2943,2944],{"class":1056},"            # Suggest squashing first 5-10 migrations if they're old enough\n",[1050,2946,2947,2950,2952,2955,2958,2961],{"class":1052,"line":1717},[1050,2948,2949],{"class":1097},"            old_migrations ",[1050,2951,1101],{"class":1077},[1050,2953,2954],{"class":1097}," app_migrations",[1050,2956,2957],{"class":1077},"[:",[1050,2959,2960],{"class":1247},"10",[1050,2962,2963],{"class":1077},"]\n",[1050,2965,2966],{"class":1052,"line":1732},[1050,2967,2968],{"class":1097},"            \n",[1050,2970,2971,2973,2975,2977,2979,2981,2983,2985],{"class":1052,"line":1748},[1050,2972,2689],{"class":1097},[1050,2974,2568],{"class":1077},[1050,2976,1161],{"class":1160},[1050,2978,2480],{"class":1164},[1050,2980,1161],{"class":1160},[1050,2982,2700],{"class":1077},[1050,2984,2596],{"class":1144},[1050,2986,2824],{"class":1077},[1050,2988,2989,2992,2994,2996,2998,3001,3003,3005],{"class":1052,"line":1785},[1050,2990,2991],{"class":1160},"                '",[1050,2993,2832],{"class":1164},[1050,2995,1161],{"class":1160},[1050,2997,2468],{"class":1077},[1050,2999,3000],{"class":1144}," old_migrations",[1050,3002,2568],{"class":1077},[1050,3004,2571],{"class":1247},[1050,3006,2846],{"class":1077},[1050,3008,3009,3011,3013,3015,3017,3019,3021,3023,3025],{"class":1052,"line":1790},[1050,3010,2991],{"class":1160},[1050,3012,2853],{"class":1164},[1050,3014,1161],{"class":1160},[1050,3016,2468],{"class":1077},[1050,3018,3000],{"class":1144},[1050,3020,2568],{"class":1077},[1050,3022,2864],{"class":2577},[1050,3024,2606],{"class":1247},[1050,3026,2846],{"class":1077},[1050,3028,3029,3031,3033,3035,3037,3039,3041,3044],{"class":1052,"line":1795},[1050,3030,2991],{"class":1160},[1050,3032,2875],{"class":1164},[1050,3034,1161],{"class":1160},[1050,3036,2468],{"class":1077},[1050,3038,2646],{"class":2329},[1050,3040,1078],{"class":1077},[1050,3042,3043],{"class":1144},"old_migrations",[1050,3045,1452],{"class":1077},[1050,3047,3048,3050,3052,3054,3056,3058,3061],{"class":1052,"line":1800},[1050,3049,2991],{"class":1160},[1050,3051,2894],{"class":1164},[1050,3053,1161],{"class":1160},[1050,3055,2468],{"class":1077},[1050,3057,1344],{"class":1160},[1050,3059,3060],{"class":1164},"Old migrations that can be safely combined",[1050,3062,2906],{"class":1160},[1050,3064,3065],{"class":1052,"line":1806},[1050,3066,3067],{"class":1077},"            })\n",[1050,3069,3070],{"class":1052,"line":1812},[1050,3071,2445],{"class":1097},[1050,3073,3074,3077],{"class":1052,"line":1818},[1050,3075,3076],{"class":2366},"        return",[1050,3078,3079],{"class":1097}," analysis\n",[1050,3081,3082],{"class":1052,"line":1823},[1050,3083,1122],{"class":1097},[1050,3085,3086,3088,3091,3093,3095,3097,3100],{"class":1052,"line":1840},[1050,3087,2326],{"class":1069},[1050,3089,3090],{"class":2423}," _find_migration_sequences",[1050,3092,1078],{"class":1077},[1050,3094,2336],{"class":2335},[1050,3096,1195],{"class":1077},[1050,3098,3099],{"class":2341}," migrations",[1050,3101,1091],{"class":1077},[1050,3103,3104,3106,3109],{"class":1052,"line":1854},[1050,3105,2435],{"class":1843},[1050,3107,3108],{"class":1847},"Find sequences of migrations that modify the same models",[1050,3110,1851],{"class":1843},[1050,3112,3113],{"class":1052,"line":1859},[1050,3114,2445],{"class":1097},[1050,3116,3117,3119,3121],{"class":1052,"line":1868},[1050,3118,2750],{"class":1097},[1050,3120,1101],{"class":1077},[1050,3122,1116],{"class":1077},[1050,3124,3125,3128,3130],{"class":1052,"line":1873},[1050,3126,3127],{"class":1097},"        current_sequence ",[1050,3129,1101],{"class":1077},[1050,3131,1116],{"class":1077},[1050,3133,3134],{"class":1052,"line":1882},[1050,3135,2445],{"class":1097},[1050,3137,3138,3140,3143,3145,3147],{"class":1052,"line":1887},[1050,3139,2532],{"class":2366},[1050,3141,3142],{"class":1097}," migration_name ",[1050,3144,2538],{"class":2366},[1050,3146,3099],{"class":1097},[1050,3148,2308],{"class":1077},[1050,3150,3151,3154,3156,3158,3160,3162,3164,3167,3169,3171,3173,3175,3177,3180],{"class":1052,"line":1893},[1050,3152,3153],{"class":1097},"            migration ",[1050,3155,1101],{"class":1077},[1050,3157,2541],{"class":2349},[1050,3159,1085],{"class":1077},[1050,3161,2399],{"class":1609},[1050,3163,1085],{"class":1077},[1050,3165,3166],{"class":1144},"get_migration",[1050,3168,1078],{"class":1077},[1050,3170,2336],{"class":2349},[1050,3172,1085],{"class":1077},[1050,3174,2355],{"class":1609},[1050,3176,1195],{"class":1077},[1050,3178,3179],{"class":1144}," migration_name",[1050,3181,2412],{"class":1077},[1050,3183,3184],{"class":1052,"line":1903},[1050,3185,2968],{"class":1097},[1050,3187,3188],{"class":1052,"line":1925},[1050,3189,3190],{"class":1056},"            # Analyze operations to see if they're related to previous migration\n",[1050,3192,3193,3195,3197,3199,3202,3204,3207,3209,3212],{"class":1052,"line":1946},[1050,3194,2562],{"class":2366},[1050,3196,2541],{"class":2349},[1050,3198,1085],{"class":1077},[1050,3200,3201],{"class":1144},"_is_related_to_sequence",[1050,3203,1078],{"class":1077},[1050,3205,3206],{"class":1144},"migration",[1050,3208,1195],{"class":1077},[1050,3210,3211],{"class":1144}," current_sequence",[1050,3213,1091],{"class":1077},[1050,3215,3216,3219,3221,3223,3225,3228],{"class":1052,"line":1967},[1050,3217,3218],{"class":1097},"                current_sequence",[1050,3220,1085],{"class":1077},[1050,3222,2596],{"class":1144},[1050,3224,1078],{"class":1077},[1050,3226,3227],{"class":1144},"migration_name",[1050,3229,2412],{"class":1077},[1050,3231,3232,3235],{"class":1052,"line":1989},[1050,3233,3234],{"class":2366},"            else",[1050,3236,2308],{"class":1077},[1050,3238,3239,3242,3244,3246,3249,3251,3253,3256],{"class":1052,"line":1994},[1050,3240,3241],{"class":2366},"                if",[1050,3243,2646],{"class":2329},[1050,3245,1078],{"class":1077},[1050,3247,3248],{"class":1144},"current_sequence",[1050,3250,2676],{"class":1077},[1050,3252,2679],{"class":2577},[1050,3254,3255],{"class":1247}," 1",[1050,3257,2308],{"class":1077},[1050,3259,3260,3263,3265,3267,3269,3271],{"class":1052,"line":1999},[1050,3261,3262],{"class":1097},"                    sequences",[1050,3264,1085],{"class":1077},[1050,3266,2596],{"class":1144},[1050,3268,1078],{"class":1077},[1050,3270,3248],{"class":1144},[1050,3272,2412],{"class":1077},[1050,3274,3275,3278,3280,3283,3285],{"class":1052,"line":2008},[1050,3276,3277],{"class":1097},"                current_sequence ",[1050,3279,1101],{"class":1077},[1050,3281,3282],{"class":1077}," [",[1050,3284,3227],{"class":1097},[1050,3286,2963],{"class":1077},[1050,3288,3289],{"class":1052,"line":2014},[1050,3290,2445],{"class":1097},[1050,3292,3293],{"class":1052,"line":2025},[1050,3294,3295],{"class":1056},"        # Add final sequence\n",[1050,3297,3298,3300,3302,3304,3306,3308,3310,3312],{"class":1052,"line":2040},[1050,3299,2667],{"class":2366},[1050,3301,2646],{"class":2329},[1050,3303,1078],{"class":1077},[1050,3305,3248],{"class":1144},[1050,3307,2676],{"class":1077},[1050,3309,2679],{"class":2577},[1050,3311,3255],{"class":1247},[1050,3313,2308],{"class":1077},[1050,3315,3316,3319,3321,3323,3325,3327],{"class":1052,"line":2047},[1050,3317,3318],{"class":1097},"            sequences",[1050,3320,1085],{"class":1077},[1050,3322,2596],{"class":1144},[1050,3324,1078],{"class":1077},[1050,3326,3248],{"class":1144},[1050,3328,2412],{"class":1077},[1050,3330,3331],{"class":1052,"line":2076},[1050,3332,2445],{"class":1097},[1050,3334,3335,3337],{"class":1052,"line":2105},[1050,3336,3076],{"class":2366},[1050,3338,3339],{"class":1097}," sequences\n",[1050,3341,3342],{"class":1052,"line":2126},[1050,3343,1122],{"class":1097},[1050,3345,3346,3348,3351,3353,3355,3357,3360,3362,3364],{"class":1052,"line":2167},[1050,3347,2326],{"class":1069},[1050,3349,3350],{"class":2423}," _is_related_to_sequence",[1050,3352,1078],{"class":1077},[1050,3354,2336],{"class":2335},[1050,3356,1195],{"class":1077},[1050,3358,3359],{"class":2341}," migration",[1050,3361,1195],{"class":1077},[1050,3363,3211],{"class":2341},[1050,3365,1091],{"class":1077},[1050,3367,3368,3370,3373],{"class":1052,"line":2196},[1050,3369,2435],{"class":1843},[1050,3371,3372],{"class":1847},"Check if migration is related to current sequence",[1050,3374,1851],{"class":1843},[1050,3376,3377],{"class":1052,"line":2237},[1050,3378,2445],{"class":1097},[1050,3380,3381,3383,3386,3388],{"class":1052,"line":2242},[1050,3382,2667],{"class":2366},[1050,3384,3385],{"class":2577}," not",[1050,3387,3211],{"class":1097},[1050,3389,2308],{"class":1077},[1050,3391,3392,3395],{"class":1052,"line":2247},[1050,3393,3394],{"class":2366},"            return",[1050,3396,1105],{"class":1104},[1050,3398,3399],{"class":1052,"line":2252},[1050,3400,2445],{"class":1097},[1050,3402,3403],{"class":1052,"line":2257},[1050,3404,3405],{"class":1056},"        # Get models affected by this migration\n",[1050,3407,3408,3411,3413,3417],{"class":1052,"line":2263},[1050,3409,3410],{"class":1097},"        affected_models ",[1050,3412,1101],{"class":1077},[1050,3414,3416],{"class":3415},"sa2tF"," set",[1050,3418,2626],{"class":1077},[1050,3420,3421],{"class":1052,"line":2269},[1050,3422,2445],{"class":1097},[1050,3424,3425,3427,3430,3432,3434,3436,3439],{"class":1052,"line":2274},[1050,3426,2532],{"class":2366},[1050,3428,3429],{"class":1097}," operation ",[1050,3431,2538],{"class":2366},[1050,3433,3359],{"class":1097},[1050,3435,1085],{"class":1077},[1050,3437,3438],{"class":1609},"operations",[1050,3440,2308],{"class":1077},[1050,3442,3443,3445,3448,3450,3453,3455,3457,3460,3462],{"class":1052,"line":2280},[1050,3444,2562],{"class":2366},[1050,3446,3447],{"class":2329}," hasattr",[1050,3449,1078],{"class":1077},[1050,3451,3452],{"class":1144},"operation",[1050,3454,1195],{"class":1077},[1050,3456,1344],{"class":1160},[1050,3458,3459],{"class":1164},"model_name",[1050,3461,1161],{"class":1160},[1050,3463,1091],{"class":1077},[1050,3465,3466,3469,3471,3474,3476,3478,3480,3482,3484,3487],{"class":1052,"line":2286},[1050,3467,3468],{"class":1097},"                affected_models",[1050,3470,1085],{"class":1077},[1050,3472,3473],{"class":1144},"add",[1050,3475,1078],{"class":1077},[1050,3477,3452],{"class":1144},[1050,3479,1085],{"class":1077},[1050,3481,3459],{"class":1609},[1050,3483,1085],{"class":1077},[1050,3485,3486],{"class":1144},"lower",[1050,3488,3489],{"class":1077},"())\n",[1050,3491,3493,3496,3498,3500,3502,3504,3506,3509,3511],{"class":1052,"line":3492},95,[1050,3494,3495],{"class":2366},"            elif",[1050,3497,3447],{"class":2329},[1050,3499,1078],{"class":1077},[1050,3501,3452],{"class":1144},[1050,3503,1195],{"class":1077},[1050,3505,1344],{"class":1160},[1050,3507,3508],{"class":1164},"name",[1050,3510,1161],{"class":1160},[1050,3512,1091],{"class":1077},[1050,3514,3516,3518,3520,3522,3524,3526,3528,3530,3532,3534],{"class":1052,"line":3515},96,[1050,3517,3468],{"class":1097},[1050,3519,1085],{"class":1077},[1050,3521,3473],{"class":1144},[1050,3523,1078],{"class":1077},[1050,3525,3452],{"class":1144},[1050,3527,1085],{"class":1077},[1050,3529,3508],{"class":1609},[1050,3531,1085],{"class":1077},[1050,3533,3486],{"class":1144},[1050,3535,3489],{"class":1077},[1050,3537,3539],{"class":1052,"line":3538},97,[1050,3540,2445],{"class":1097},[1050,3542,3544],{"class":1052,"line":3543},98,[1050,3545,3546],{"class":1056},"        # Check if it affects similar models to recent migrations in sequence\n",[1050,3548,3550],{"class":1052,"line":3549},99,[1050,3551,3552],{"class":1056},"        # This is a simplified heuristic\n",[1050,3554,3556,3558,3560,3562,3565,3567,3569],{"class":1052,"line":3555},100,[1050,3557,3076],{"class":2366},[1050,3559,2646],{"class":2329},[1050,3561,1078],{"class":1077},[1050,3563,3564],{"class":1144},"affected_models",[1050,3566,2676],{"class":1077},[1050,3568,2679],{"class":2577},[1050,3570,3571],{"class":1247}," 0\n",[1050,3573,3575],{"class":1052,"line":3574},101,[1050,3576,1122],{"class":1097},[1050,3578,3580,3582,3585,3587,3589,3591,3594,3596,3599],{"class":1052,"line":3579},102,[1050,3581,2326],{"class":1069},[1050,3583,3584],{"class":2423}," check_squashing_safety",[1050,3586,1078],{"class":1077},[1050,3588,2336],{"class":2335},[1050,3590,1195],{"class":1077},[1050,3592,3593],{"class":2341}," start_migration",[1050,3595,1195],{"class":1077},[1050,3597,3598],{"class":2341}," end_migration",[1050,3600,1091],{"class":1077},[1050,3602,3604,3606,3609],{"class":1052,"line":3603},103,[1050,3605,2435],{"class":1843},[1050,3607,3608],{"class":1847},"Check if it's safe to squash a range of migrations",[1050,3610,1851],{"class":1843},[1050,3612,3614],{"class":1052,"line":3613},104,[1050,3615,2445],{"class":1097},[1050,3617,3619,3622,3624],{"class":1052,"line":3618},105,[1050,3620,3621],{"class":1097},"        safety_check ",[1050,3623,1101],{"class":1077},[1050,3625,2455],{"class":1077},[1050,3627,3629,3631,3634,3636,3638,3641],{"class":1052,"line":3628},106,[1050,3630,2460],{"class":1160},[1050,3632,3633],{"class":1164},"safe_to_squash",[1050,3635,1161],{"class":1160},[1050,3637,2468],{"class":1077},[1050,3639,3640],{"class":1104}," True",[1050,3642,1170],{"class":1077},[1050,3644,3646,3648,3651,3653,3655],{"class":1052,"line":3645},107,[1050,3647,2460],{"class":1160},[1050,3649,3650],{"class":1164},"warnings",[1050,3652,1161],{"class":1160},[1050,3654,2468],{"class":1077},[1050,3656,2487],{"class":1077},[1050,3658,3660,3662,3665,3667,3669],{"class":1052,"line":3659},108,[1050,3661,2460],{"class":1160},[1050,3663,3664],{"class":1164},"blocking_issues",[1050,3666,1161],{"class":1160},[1050,3668,2468],{"class":1077},[1050,3670,1116],{"class":1077},[1050,3672,3674],{"class":1052,"line":3673},109,[1050,3675,2505],{"class":1077},[1050,3677,3679],{"class":1052,"line":3678},110,[1050,3680,2445],{"class":1097},[1050,3682,3684],{"class":1052,"line":3683},111,[1050,3685,3686],{"class":1056},"        # Get migrations in range\n",[1050,3688,3690,3692,3694],{"class":1052,"line":3689},112,[1050,3691,2519],{"class":1097},[1050,3693,1101],{"class":1077},[1050,3695,1116],{"class":1077},[1050,3697,3699],{"class":1052,"line":3698},113,[1050,3700,2445],{"class":1097},[1050,3702,3704,3706,3708,3710,3712,3714,3716,3718,3720,3722,3724],{"class":1052,"line":3703},114,[1050,3705,2532],{"class":2366},[1050,3707,2535],{"class":1097},[1050,3709,2538],{"class":2366},[1050,3711,2541],{"class":2349},[1050,3713,1085],{"class":1077},[1050,3715,2399],{"class":1609},[1050,3717,1085],{"class":1077},[1050,3719,2550],{"class":1609},[1050,3721,1085],{"class":1077},[1050,3723,2555],{"class":1609},[1050,3725,2308],{"class":1077},[1050,3727,3729,3731,3733,3735,3737,3739,3741,3743,3745,3747],{"class":1052,"line":3728},115,[1050,3730,2562],{"class":2366},[1050,3732,2565],{"class":1097},[1050,3734,2568],{"class":1077},[1050,3736,2571],{"class":1247},[1050,3738,2574],{"class":1077},[1050,3740,2578],{"class":2577},[1050,3742,2541],{"class":2349},[1050,3744,1085],{"class":1077},[1050,3746,2355],{"class":1609},[1050,3748,2308],{"class":1077},[1050,3750,3752,3754,3756,3758,3760,3762,3764,3766],{"class":1052,"line":3751},116,[1050,3753,2591],{"class":1097},[1050,3755,1085],{"class":1077},[1050,3757,2596],{"class":1144},[1050,3759,1078],{"class":1077},[1050,3761,2601],{"class":1144},[1050,3763,2568],{"class":1077},[1050,3765,2606],{"class":1247},[1050,3767,2609],{"class":1077},[1050,3769,3771],{"class":1052,"line":3770},117,[1050,3772,2445],{"class":1097},[1050,3774,3776,3778,3780,3782],{"class":1052,"line":3775},118,[1050,3777,2618],{"class":1097},[1050,3779,1085],{"class":1077},[1050,3781,2623],{"class":1144},[1050,3783,2626],{"class":1077},[1050,3785,3787],{"class":1052,"line":3786},119,[1050,3788,2445],{"class":1097},[1050,3790,3792,3795],{"class":1052,"line":3791},120,[1050,3793,3794],{"class":2366},"        try",[1050,3796,2308],{"class":1077},[1050,3798,3800,3803,3805,3807,3809,3812,3814,3816],{"class":1052,"line":3799},121,[1050,3801,3802],{"class":1097},"            start_idx ",[1050,3804,1101],{"class":1077},[1050,3806,2954],{"class":1097},[1050,3808,1085],{"class":1077},[1050,3810,3811],{"class":1144},"index",[1050,3813,1078],{"class":1077},[1050,3815,2832],{"class":1144},[1050,3817,2412],{"class":1077},[1050,3819,3821,3824,3826,3828,3830,3832,3834,3836],{"class":1052,"line":3820},122,[1050,3822,3823],{"class":1097},"            end_idx ",[1050,3825,1101],{"class":1077},[1050,3827,2954],{"class":1097},[1050,3829,1085],{"class":1077},[1050,3831,3811],{"class":1144},[1050,3833,1078],{"class":1077},[1050,3835,2853],{"class":1144},[1050,3837,2412],{"class":1077},[1050,3839,3841,3844,3847],{"class":1052,"line":3840},123,[1050,3842,3843],{"class":2366},"        except",[1050,3845,3846],{"class":3415}," ValueError",[1050,3848,2308],{"class":1077},[1050,3850,3852,3855,3857,3859,3861,3863,3865,3867],{"class":1052,"line":3851},124,[1050,3853,3854],{"class":1097},"            safety_check",[1050,3856,2568],{"class":1077},[1050,3858,1161],{"class":1160},[1050,3860,3633],{"class":1164},[1050,3862,1161],{"class":1160},[1050,3864,2574],{"class":1077},[1050,3866,2358],{"class":1077},[1050,3868,3869],{"class":1104}," False\n",[1050,3871,3873,3875,3877,3879,3881,3883,3885,3887,3889,3892,3895,3897],{"class":1052,"line":3872},125,[1050,3874,3854],{"class":1097},[1050,3876,2568],{"class":1077},[1050,3878,1161],{"class":1160},[1050,3880,3664],{"class":1164},[1050,3882,1161],{"class":1160},[1050,3884,2700],{"class":1077},[1050,3886,2596],{"class":1144},[1050,3888,1078],{"class":1077},[1050,3890,3891],{"class":1160},"\"",[1050,3893,3894],{"class":1164},"Invalid migration range",[1050,3896,3891],{"class":1160},[1050,3898,2412],{"class":1077},[1050,3900,3902,3904],{"class":1052,"line":3901},126,[1050,3903,3394],{"class":2366},[1050,3905,3906],{"class":1097}," safety_check\n",[1050,3908,3910],{"class":1052,"line":3909},127,[1050,3911,2445],{"class":1097},[1050,3913,3915,3918,3920,3922,3924,3927,3929,3932,3935,3937],{"class":1052,"line":3914},128,[1050,3916,3917],{"class":1097},"        migrations_to_squash ",[1050,3919,1101],{"class":1077},[1050,3921,2954],{"class":1097},[1050,3923,2568],{"class":1077},[1050,3925,3926],{"class":1097},"start_idx",[1050,3928,2468],{"class":1077},[1050,3930,3931],{"class":1097},"end_idx ",[1050,3933,3934],{"class":2577},"+",[1050,3936,3255],{"class":1247},[1050,3938,2963],{"class":1077},[1050,3940,3942],{"class":1052,"line":3941},129,[1050,3943,2445],{"class":1097},[1050,3945,3947],{"class":1052,"line":3946},130,[1050,3948,3949],{"class":1056},"        # Check for complex operations\n",[1050,3951,3953,3955,3957,3959,3962],{"class":1052,"line":3952},131,[1050,3954,2532],{"class":2366},[1050,3956,3142],{"class":1097},[1050,3958,2538],{"class":2366},[1050,3960,3961],{"class":1097}," migrations_to_squash",[1050,3963,2308],{"class":1077},[1050,3965,3967,3969,3971,3973,3975,3977,3979,3981,3983,3985,3987,3989,3991,3993],{"class":1052,"line":3966},132,[1050,3968,3153],{"class":1097},[1050,3970,1101],{"class":1077},[1050,3972,2541],{"class":2349},[1050,3974,1085],{"class":1077},[1050,3976,2399],{"class":1609},[1050,3978,1085],{"class":1077},[1050,3980,3166],{"class":1144},[1050,3982,1078],{"class":1077},[1050,3984,2336],{"class":2349},[1050,3986,1085],{"class":1077},[1050,3988,2355],{"class":1609},[1050,3990,1195],{"class":1077},[1050,3992,3179],{"class":1144},[1050,3994,2412],{"class":1077},[1050,3996,3998],{"class":1052,"line":3997},133,[1050,3999,2968],{"class":1097},[1050,4001,4003,4006,4008,4010,4012,4014,4016],{"class":1052,"line":4002},134,[1050,4004,4005],{"class":2366},"            for",[1050,4007,3429],{"class":1097},[1050,4009,2538],{"class":2366},[1050,4011,3359],{"class":1097},[1050,4013,1085],{"class":1077},[1050,4015,3438],{"class":1609},[1050,4017,2308],{"class":1077},[1050,4019,4021,4024,4026,4029,4031,4035,4037],{"class":1052,"line":4020},135,[1050,4022,4023],{"class":1097},"                op_name ",[1050,4025,1101],{"class":1077},[1050,4027,4028],{"class":1097}," operation",[1050,4030,1085],{"class":1077},[1050,4032,4034],{"class":4033},"s131V","__class__",[1050,4036,1085],{"class":1077},[1050,4038,4039],{"class":4033},"__name__\n",[1050,4041,4043],{"class":1052,"line":4042},136,[1050,4044,4045],{"class":1097},"                \n",[1050,4047,4049],{"class":1052,"line":4048},137,[1050,4050,4051],{"class":1056},"                # Check for operations that might not squash well\n",[1050,4053,4055,4057,4060,4063,4065,4068,4070],{"class":1052,"line":4054},138,[1050,4056,3241],{"class":2366},[1050,4058,4059],{"class":1097}," op_name ",[1050,4061,4062],{"class":2577},"==",[1050,4064,1344],{"class":1160},[1050,4066,4067],{"class":1164},"RunPython",[1050,4069,1161],{"class":1160},[1050,4071,2308],{"class":1077},[1050,4073,4075,4078,4080,4082,4084,4086,4088,4090],{"class":1052,"line":4074},139,[1050,4076,4077],{"class":1097},"                    safety_check",[1050,4079,2568],{"class":1077},[1050,4081,1161],{"class":1160},[1050,4083,3650],{"class":1164},[1050,4085,1161],{"class":1160},[1050,4087,2700],{"class":1077},[1050,4089,2596],{"class":1144},[1050,4091,1148],{"class":1077},[1050,4093,4095,4098,4101,4103,4105,4107],{"class":1052,"line":4094},140,[1050,4096,4097],{"class":1069},"                        f",[1050,4099,4100],{"class":1164},"\"Migration ",[1050,4102,2716],{"class":2715},[1050,4104,3227],{"class":1144},[1050,4106,2728],{"class":2715},[1050,4108,4109],{"class":1164}," contains RunPython operation\"\n",[1050,4111,4113],{"class":1052,"line":4112},141,[1050,4114,4115],{"class":1077},"                    )\n",[1050,4117,4119],{"class":1052,"line":4118},142,[1050,4120,4045],{"class":1097},[1050,4122,4124,4127,4129,4131,4133,4136,4138],{"class":1052,"line":4123},143,[1050,4125,4126],{"class":2366},"                elif",[1050,4128,4059],{"class":1097},[1050,4130,4062],{"class":2577},[1050,4132,1344],{"class":1160},[1050,4134,4135],{"class":1164},"RunSQL",[1050,4137,1161],{"class":1160},[1050,4139,2308],{"class":1077},[1050,4141,4143,4145,4147,4149,4151,4153,4155,4157],{"class":1052,"line":4142},144,[1050,4144,4077],{"class":1097},[1050,4146,2568],{"class":1077},[1050,4148,1161],{"class":1160},[1050,4150,3650],{"class":1164},[1050,4152,1161],{"class":1160},[1050,4154,2700],{"class":1077},[1050,4156,2596],{"class":1144},[1050,4158,1148],{"class":1077},[1050,4160,4162,4164,4166,4168,4170,4172],{"class":1052,"line":4161},145,[1050,4163,4097],{"class":1069},[1050,4165,4100],{"class":1164},[1050,4167,2716],{"class":2715},[1050,4169,3227],{"class":1144},[1050,4171,2728],{"class":2715},[1050,4173,4174],{"class":1164}," contains RunSQL operation\"\n",[1050,4176,4178],{"class":1052,"line":4177},146,[1050,4179,4115],{"class":1077},[1050,4181,4183],{"class":1052,"line":4182},147,[1050,4184,4045],{"class":1097},[1050,4186,4188,4190,4192,4194,4196,4198,4201,4203,4205,4207,4210,4212],{"class":1052,"line":4187},148,[1050,4189,4126],{"class":2366},[1050,4191,4059],{"class":1097},[1050,4193,2538],{"class":2577},[1050,4195,3282],{"class":1077},[1050,4197,1161],{"class":1160},[1050,4199,4200],{"class":1164},"RemoveField",[1050,4202,1161],{"class":1160},[1050,4204,1195],{"class":1077},[1050,4206,1344],{"class":1160},[1050,4208,4209],{"class":1164},"DeleteModel",[1050,4211,1161],{"class":1160},[1050,4213,4214],{"class":1077},"]:\n",[1050,4216,4218,4220,4222,4224,4226,4228,4230,4232],{"class":1052,"line":4217},149,[1050,4219,4077],{"class":1097},[1050,4221,2568],{"class":1077},[1050,4223,1161],{"class":1160},[1050,4225,3650],{"class":1164},[1050,4227,1161],{"class":1160},[1050,4229,2700],{"class":1077},[1050,4231,2596],{"class":1144},[1050,4233,1148],{"class":1077},[1050,4235,4237,4239,4241,4243,4245,4247,4250,4252,4255,4257],{"class":1052,"line":4236},150,[1050,4238,4097],{"class":1069},[1050,4240,4100],{"class":1164},[1050,4242,2716],{"class":2715},[1050,4244,3227],{"class":1144},[1050,4246,2728],{"class":2715},[1050,4248,4249],{"class":1164}," contains destructive operation: ",[1050,4251,2716],{"class":2715},[1050,4253,4254],{"class":1144},"op_name",[1050,4256,2728],{"class":2715},[1050,4258,4259],{"class":1164},"\"\n",[1050,4261,4263],{"class":1052,"line":4262},151,[1050,4264,4115],{"class":1077},[1050,4266,4268],{"class":1052,"line":4267},152,[1050,4269,2445],{"class":1097},[1050,4271,4273],{"class":1052,"line":4272},153,[1050,4274,4275],{"class":1056},"        # Check for external dependencies\n",[1050,4277,4279,4281,4283,4285,4287],{"class":1052,"line":4278},154,[1050,4280,2532],{"class":2366},[1050,4282,3142],{"class":1097},[1050,4284,2538],{"class":2366},[1050,4286,3961],{"class":1097},[1050,4288,2308],{"class":1077},[1050,4290,4292,4294,4296,4298,4300,4302,4304,4306,4308,4310,4312,4314,4316,4318],{"class":1052,"line":4291},155,[1050,4293,3153],{"class":1097},[1050,4295,1101],{"class":1077},[1050,4297,2541],{"class":2349},[1050,4299,1085],{"class":1077},[1050,4301,2399],{"class":1609},[1050,4303,1085],{"class":1077},[1050,4305,3166],{"class":1144},[1050,4307,1078],{"class":1077},[1050,4309,2336],{"class":2349},[1050,4311,1085],{"class":1077},[1050,4313,2355],{"class":1609},[1050,4315,1195],{"class":1077},[1050,4317,3179],{"class":1144},[1050,4319,2412],{"class":1077},[1050,4321,4323],{"class":1052,"line":4322},156,[1050,4324,2968],{"class":1097},[1050,4326,4328,4330,4333,4335,4338,4340,4342,4344,4347],{"class":1052,"line":4327},157,[1050,4329,4005],{"class":2366},[1050,4331,4332],{"class":1097}," dep_app",[1050,4334,1195],{"class":1077},[1050,4336,4337],{"class":1097}," dep_migration ",[1050,4339,2538],{"class":2366},[1050,4341,3359],{"class":1097},[1050,4343,1085],{"class":1077},[1050,4345,4346],{"class":1609},"dependencies",[1050,4348,2308],{"class":1077},[1050,4350,4352,4354,4357,4360,4362,4364,4366],{"class":1052,"line":4351},158,[1050,4353,3241],{"class":2366},[1050,4355,4356],{"class":1097}," dep_app ",[1050,4358,4359],{"class":2577},"!=",[1050,4361,2541],{"class":2349},[1050,4363,1085],{"class":1077},[1050,4365,2355],{"class":1609},[1050,4367,2308],{"class":1077},[1050,4369,4371,4373,4375,4377,4379,4381,4383,4385],{"class":1052,"line":4370},159,[1050,4372,4077],{"class":1097},[1050,4374,2568],{"class":1077},[1050,4376,1161],{"class":1160},[1050,4378,3650],{"class":1164},[1050,4380,1161],{"class":1160},[1050,4382,2700],{"class":1077},[1050,4384,2596],{"class":1144},[1050,4386,1148],{"class":1077},[1050,4388,4390,4392,4394,4396,4398,4400,4403,4405,4408,4410,4412,4414,4417,4419],{"class":1052,"line":4389},160,[1050,4391,4097],{"class":1069},[1050,4393,4100],{"class":1164},[1050,4395,2716],{"class":2715},[1050,4397,3227],{"class":1144},[1050,4399,2728],{"class":2715},[1050,4401,4402],{"class":1164}," depends on external app: ",[1050,4404,2716],{"class":2715},[1050,4406,4407],{"class":1144},"dep_app",[1050,4409,2728],{"class":2715},[1050,4411,1085],{"class":1164},[1050,4413,2716],{"class":2715},[1050,4415,4416],{"class":1144},"dep_migration",[1050,4418,2728],{"class":2715},[1050,4420,4259],{"class":1164},[1050,4422,4424],{"class":1052,"line":4423},161,[1050,4425,4115],{"class":1077},[1050,4427,4429],{"class":1052,"line":4428},162,[1050,4430,2445],{"class":1097},[1050,4432,4434,4436],{"class":1052,"line":4433},163,[1050,4435,3076],{"class":2366},[1050,4437,3906],{"class":1097},[1030,4439,4441],{"id":4440},"squashing-process-and-best-practices","Squashing Process and Best Practices",[1035,4443,4445],{"id":4444},"manual-squashing-process","Manual Squashing Process",[1040,4447,4449],{"className":1042,"code":4448,"language":1044,"meta":1045,"style":1045},"class ManualSquashingProcess:\n    \"\"\"Manual process for squashing migrations\"\"\"\n    \n    @staticmethod\n    def prepare_for_squashing():\n        \"\"\"Prepare project for migration squashing\"\"\"\n        \n        preparation_steps = [\n            \"1. Ensure all migrations are applied in all environments\",\n            \"2. Create backup of migration files\",\n            \"3. Verify no pending migrations exist\",\n            \"4. Check that all team members have latest migrations\",\n            \"5. Ensure CI/CD pipeline is not running migrations\",\n            \"6. Document current migration state\"\n        ]\n        \n        return preparation_steps\n    \n    @staticmethod\n    def create_squashed_migration():\n        \"\"\"Create a squashed migration manually\"\"\"\n        \n        # Example of manually creating a squashed migration\n        squashed_migration_template = '''\nfrom django.db import migrations, models\nimport django.db.models.deletion\n\nclass Migration(migrations.Migration):\n    \"\"\"\n    Squashed migration combining migrations 0001-0005\n    \n    This migration replaces:\n    - 0001_initial: Created Post model\n    - 0002_add_author: Added author field\n    - 0003_add_created_at: Added created_at field\n    - 0004_add_status: Added status field\n    - 0005_add_category: Added category relationship\n    \n    Safe to apply on fresh databases.\n    \"\"\"\n    \n    initial = True\n    \n    dependencies = [\n        ('auth', '0012_alter_user_first_name_max_length'),\n    ]\n    \n    replaces = [\n        ('blog', '0001_initial'),\n        ('blog', '0002_add_author'),\n        ('blog', '0003_add_created_at'),\n        ('blog', '0004_add_status'),\n        ('blog', '0005_add_category'),\n    ]\n    \n    operations = [\n        migrations.CreateModel(\n            name='Category',\n            fields=[\n                ('id', models.AutoField(primary_key=True)),\n                ('name', models.CharField(max_length=100)),\n                ('description', models.TextField(blank=True)),\n            ],\n        ),\n        migrations.CreateModel(\n            name='Post',\n            fields=[\n                ('id', models.AutoField(primary_key=True)),\n                ('title', models.CharField(max_length=200)),\n                ('content', models.TextField()),\n                ('author', models.ForeignKey(\n                    on_delete=django.db.models.deletion.CASCADE,\n                    to='auth.user'\n                )),\n                ('created_at', models.DateTimeField(auto_now_add=True)),\n                ('status', models.CharField(\n                    choices=[('draft', 'Draft'), ('published', 'Published')],\n                    default='draft',\n                    max_length=20\n                )),\n                ('category', models.ForeignKey(\n                    on_delete=django.db.models.deletion.CASCADE,\n                    to='blog.category'\n                )),\n            ],\n            options={\n                'ordering': ['-created_at'],\n            },\n        ),\n    ]\n'''\n        \n        return squashed_migration_template\n    \n    @staticmethod\n    def validate_squashed_migration():\n        \"\"\"Validate that squashed migration works correctly\"\"\"\n        \n        validation_steps = [\n            \"1. Test migration on fresh database\",\n            \"2. Compare final schema with original migrations\",\n            \"3. Verify all indexes and constraints are created\",\n            \"4. Test migration rollback if applicable\",\n            \"5. Check that data migrations are preserved\",\n            \"6. Validate foreign key relationships\",\n            \"7. Test with different database backends if used\"\n        ]\n        \n        return validation_steps\n    \n    @staticmethod\n    def cleanup_after_squashing():\n        \"\"\"Clean up after successful squashing\"\"\"\n        \n        cleanup_steps = [\n            \"1. Remove original migration files (keep backup)\",\n            \"2. Update migration dependencies in other apps if needed\",\n            \"3. Test full migration process from scratch\",\n            \"4. Update documentation\",\n            \"5. Notify team of migration changes\",\n            \"6. Update deployment scripts if they reference specific migrations\"\n        ]\n        \n        return cleanup_steps\n\n# Advanced squashing techniques\nclass AdvancedSquashingTechniques:\n    \"\"\"Advanced techniques for migration squashing\"\"\"\n    \n    @staticmethod\n    def squash_with_data_preservation():\n        \"\"\"Squash migrations while preserving data migrations\"\"\"\n        \n        def create_data_preserving_squash():\n            \"\"\"Create squashed migration that preserves data operations\"\"\"\n            \n            # When squashing migrations with RunPython operations,\n            # you need to preserve the data migration logic\n            \n            def combined_data_migration(apps, schema_editor):\n                \"\"\"Combined data migration from multiple migrations\"\"\"\n                \n                Post = apps.get_model('blog', 'Post')\n                \n                # Data migration from 0002: Set default authors\n                Post.objects.filter(author__isnull=True).update(\n                    author_id=1  # Default admin user\n                )\n                \n                # Data migration from 0004: Set default status\n                Post.objects.filter(status__isnull=True).update(\n                    status='draft'\n                )\n                \n                # Data migration from 0005: Assign default category\n                Category = apps.get_model('blog', 'Category')\n                default_category, created = Category.objects.get_or_create(\n                    name='General',\n                    defaults={'description': 'General posts'}\n                )\n                \n                Post.objects.filter(category__isnull=True).update(\n                    category=default_category\n                )\n            \n            def reverse_combined_data_migration(apps, schema_editor):\n                \"\"\"Reverse the combined data migration\"\"\"\n                \n                # Usually just clear the fields back to null\n                Post = apps.get_model('blog', 'Post')\n                Post.objects.update(\n                    author=None,\n                    status=None,\n                    category=None\n                )\n            \n            # The squashed migration would include:\n            squashed_operations = [\n                # Schema operations (combined)\n                migrations.CreateModel(name='Category', fields=[...]),\n                migrations.CreateModel(name='Post', fields=[...]),\n                \n                # Combined data migration\n                migrations.RunPython(\n                    code=combined_data_migration,\n                    reverse_code=reverse_combined_data_migration,\n                ),\n            ]\n            \n            return squashed_operations\n        \n        return create_data_preserving_squash\n    \n    @staticmethod\n    def conditional_squashing():\n        \"\"\"Squash migrations conditionally based on environment\"\"\"\n        \n        def conditional_squash_migration(apps, schema_editor):\n            \"\"\"Migration that behaves differently based on existing data\"\"\"\n            \n            Post = apps.get_model('blog', 'Post')\n            \n            # Check if this is a fresh installation or existing data\n            existing_posts = Post.objects.exists()\n            \n            if not existing_posts:\n                # Fresh installation - create everything at once\n                print(\"Fresh installation detected - creating optimized schema\")\n                \n                # All schema operations are handled by the CreateModel operations\n                # No additional data migrations needed\n                \n            else:\n                # Existing installation - need to handle data carefully\n                print(\"Existing data detected - running compatibility migrations\")\n                \n                # Run data migrations that would have been in original migrations\n                # This ensures existing installations work correctly\n                \n                # Example: Populate fields that were added in separate migrations\n                Post.objects.filter(status__isnull=True).update(status='draft')\n                Post.objects.filter(author__isnull=True).update(author_id=1)\n        \n        return conditional_squash_migration\n    \n    @staticmethod\n    def optimize_squashed_operations():\n        \"\"\"Optimize operations in squashed migrations\"\"\"\n        \n        def optimize_operations(original_operations):\n            \"\"\"Optimize a list of migration operations\"\"\"\n            \n            optimized = []\n            \n            # Group operations by model\n            operations_by_model = {}\n            \n            for operation in original_operations:\n                model_name = getattr(operation, 'model_name', None) or getattr(operation, 'name', None)\n                \n                if model_name:\n                    if model_name not in operations_by_model:\n                        operations_by_model[model_name] = []\n                    operations_by_model[model_name].append(operation)\n                else:\n                    # Non-model operations (like RunPython)\n                    optimized.append(operation)\n            \n            # Optimize operations for each model\n            for model_name, model_operations in operations_by_model.items():\n                optimized_model_ops = optimize_model_operations(model_operations)\n                optimized.extend(optimized_model_ops)\n            \n            return optimized\n        \n        def optimize_model_operations(operations):\n            \"\"\"Optimize operations for a single model\"\"\"\n            \n            # Look for patterns that can be optimized\n            \n            # Pattern 1: CreateModel followed by AddField operations\n            create_model_op = None\n            add_field_ops = []\n            other_ops = []\n            \n            for op in operations:\n                if op.__class__.__name__ == 'CreateModel':\n                    create_model_op = op\n                elif op.__class__.__name__ == 'AddField':\n                    add_field_ops.append(op)\n                else:\n                    other_ops.append(op)\n            \n            optimized = []\n            \n            if create_model_op and add_field_ops:\n                # Combine CreateModel with AddField operations\n                combined_fields = list(create_model_op.fields)\n                \n                for add_field_op in add_field_ops:\n                    combined_fields.append((add_field_op.name, add_field_op.field))\n                \n                # Create optimized CreateModel operation\n                optimized_create = migrations.CreateModel(\n                    name=create_model_op.name,\n                    fields=combined_fields,\n                    options=create_model_op.options,\n                    bases=create_model_op.bases,\n                    managers=create_model_op.managers,\n                )\n                \n                optimized.append(optimized_create)\n            \n            elif create_model_op:\n                optimized.append(create_model_op)\n            \n            # Add other operations\n            optimized.extend(other_ops)\n            \n            return optimized\n        \n        return optimize_operations\n",[1047,4450,4451,4460,4469,4473,4481,4491,4500,4504,4513,4525,4536,4547,4558,4569,4578,4583,4587,4594,4598,4604,4613,4622,4626,4631,4641,4646,4651,4655,4660,4665,4670,4674,4679,4684,4689,4694,4699,4704,4708,4713,4717,4721,4726,4730,4735,4740,4744,4748,4753,4758,4763,4768,4773,4778,4782,4786,4791,4796,4801,4806,4811,4816,4821,4825,4829,4833,4838,4842,4846,4851,4856,4861,4866,4871,4876,4881,4886,4891,4896,4901,4905,4910,4914,4919,4923,4927,4932,4937,4942,4946,4950,4955,4959,4966,4970,4976,4985,4994,4998,5007,5018,5029,5040,5051,5062,5073,5082,5086,5090,5097,5101,5107,5116,5125,5129,5138,5149,5160,5171,5182,5193,5202,5206,5210,5217,5221,5226,5235,5244,5248,5254,5263,5272,5276,5286,5296,5300,5305,5310,5314,5334,5344,5348,5381,5385,5390,5422,5434,5439,5443,5448,5475,5488,5492,5496,5501,5533,5559,5575,5602,5606,5610,5637,5647,5652,5657,5675,5685,5690,5696,5727,5742,5755,5766,5776,5781,5786,5792,5802,5808,5845,5876,5881,5887,5898,5911,5924,5930,5936,5941,5949,5954,5962,5967,5974,5984,5994,5999,6017,6027,6032,6064,6069,6075,6097,6102,6114,6120,6137,6142,6148,6154,6159,6166,6172,6188,6193,6199,6205,6210,6216,6255,6291,6296,6304,6309,6316,6326,6336,6341,6356,6366,6371,6381,6386,6392,6403,6408,6422,6475,6480,6490,6510,6526,6546,6554,6560,6576,6581,6587,6610,6628,6646,6651,6659,6664,6677,6687,6692,6698,6703,6709,6720,6730,6740,6745,6760,6787,6798,6823,6840,6847,6863,6868,6877,6882,6898,6904,6927,6932,6947,6980,6985,6991,7007,7022,7035,7052,7069,7086,7091,7096,7112,7117,7127,7142,7147,7153,7170,7175,7182,7187],{"__ignoreMap":1045},[1050,4452,4453,4455,4458],{"class":1052,"line":1053},[1050,4454,1070],{"class":1069},[1050,4456,4457],{"class":1073}," ManualSquashingProcess",[1050,4459,2308],{"class":1077},[1050,4461,4462,4464,4467],{"class":1052,"line":1060},[1050,4463,1844],{"class":1843},[1050,4465,4466],{"class":1847},"Manual process for squashing migrations",[1050,4468,1851],{"class":1843},[1050,4470,4471],{"class":1052,"line":1066},[1050,4472,1122],{"class":1097},[1050,4474,4475,4478],{"class":1052,"line":1094},[1050,4476,4477],{"class":1077},"    @",[1050,4479,4480],{"class":3415},"staticmethod\n",[1050,4482,4483,4485,4488],{"class":1052,"line":1108},[1050,4484,2326],{"class":1069},[1050,4486,4487],{"class":2423}," prepare_for_squashing",[1050,4489,4490],{"class":1077},"():\n",[1050,4492,4493,4495,4498],{"class":1052,"line":1119},[1050,4494,2435],{"class":1843},[1050,4496,4497],{"class":1847},"Prepare project for migration squashing",[1050,4499,1851],{"class":1843},[1050,4501,4502],{"class":1052,"line":1125},[1050,4503,2445],{"class":1097},[1050,4505,4506,4509,4511],{"class":1052,"line":1136},[1050,4507,4508],{"class":1097},"        preparation_steps ",[1050,4510,1101],{"class":1077},[1050,4512,1133],{"class":1077},[1050,4514,4515,4518,4521,4523],{"class":1052,"line":1151},[1050,4516,4517],{"class":1160},"            \"",[1050,4519,4520],{"class":1164},"1. Ensure all migrations are applied in all environments",[1050,4522,3891],{"class":1160},[1050,4524,1170],{"class":1077},[1050,4526,4527,4529,4532,4534],{"class":1052,"line":1173},[1050,4528,4517],{"class":1160},[1050,4530,4531],{"class":1164},"2. Create backup of migration files",[1050,4533,3891],{"class":1160},[1050,4535,1170],{"class":1077},[1050,4537,4538,4540,4543,4545],{"class":1052,"line":1182},[1050,4539,4517],{"class":1160},[1050,4541,4542],{"class":1164},"3. Verify no pending migrations exist",[1050,4544,3891],{"class":1160},[1050,4546,1170],{"class":1077},[1050,4548,4549,4551,4554,4556],{"class":1052,"line":1219},[1050,4550,4517],{"class":1160},[1050,4552,4553],{"class":1164},"4. Check that all team members have latest migrations",[1050,4555,3891],{"class":1160},[1050,4557,1170],{"class":1077},[1050,4559,4560,4562,4565,4567],{"class":1052,"line":1253},[1050,4561,4517],{"class":1160},[1050,4563,4564],{"class":1164},"5. Ensure CI/CD pipeline is not running migrations",[1050,4566,3891],{"class":1160},[1050,4568,1170],{"class":1077},[1050,4570,4571,4573,4576],{"class":1052,"line":1277},[1050,4572,4517],{"class":1160},[1050,4574,4575],{"class":1164},"6. Document current migration state",[1050,4577,4259],{"class":1160},[1050,4579,4580],{"class":1052,"line":1283},[1050,4581,4582],{"class":1077},"        ]\n",[1050,4584,4585],{"class":1052,"line":1289},[1050,4586,2445],{"class":1097},[1050,4588,4589,4591],{"class":1052,"line":1295},[1050,4590,3076],{"class":2366},[1050,4592,4593],{"class":1097}," preparation_steps\n",[1050,4595,4596],{"class":1052,"line":1302},[1050,4597,1122],{"class":1097},[1050,4599,4600,4602],{"class":1052,"line":1308},[1050,4601,4477],{"class":1077},[1050,4603,4480],{"class":3415},[1050,4605,4606,4608,4611],{"class":1052,"line":1325},[1050,4607,2326],{"class":1069},[1050,4609,4610],{"class":2423}," create_squashed_migration",[1050,4612,4490],{"class":1077},[1050,4614,4615,4617,4620],{"class":1052,"line":1355},[1050,4616,2435],{"class":1843},[1050,4618,4619],{"class":1847},"Create a squashed migration manually",[1050,4621,1851],{"class":1843},[1050,4623,4624],{"class":1052,"line":1360},[1050,4625,2445],{"class":1097},[1050,4627,4628],{"class":1052,"line":1369},[1050,4629,4630],{"class":1056},"        # Example of manually creating a squashed migration\n",[1050,4632,4633,4636,4638],{"class":1052,"line":1381},[1050,4634,4635],{"class":1097},"        squashed_migration_template ",[1050,4637,1101],{"class":1077},[1050,4639,4640],{"class":1160}," '''\n",[1050,4642,4643],{"class":1052,"line":1398},[1050,4644,4645],{"class":1164},"from django.db import migrations, models\n",[1050,4647,4648],{"class":1052,"line":1414},[1050,4649,4650],{"class":1164},"import django.db.models.deletion\n",[1050,4652,4653],{"class":1052,"line":1455},[1050,4654,1299],{"emptyLinePlaceholder":1298},[1050,4656,4657],{"class":1052,"line":1460},[1050,4658,4659],{"class":1164},"class Migration(migrations.Migration):\n",[1050,4661,4662],{"class":1052,"line":1465},[1050,4663,4664],{"class":1164},"    \"\"\"\n",[1050,4666,4667],{"class":1052,"line":1470},[1050,4668,4669],{"class":1164},"    Squashed migration combining migrations 0001-0005\n",[1050,4671,4672],{"class":1052,"line":1476},[1050,4673,1122],{"class":1164},[1050,4675,4676],{"class":1052,"line":1493},[1050,4677,4678],{"class":1164},"    This migration replaces:\n",[1050,4680,4681],{"class":1052,"line":1519},[1050,4682,4683],{"class":1164},"    - 0001_initial: Created Post model\n",[1050,4685,4686],{"class":1052,"line":1524},[1050,4687,4688],{"class":1164},"    - 0002_add_author: Added author field\n",[1050,4690,4691],{"class":1052,"line":1533},[1050,4692,4693],{"class":1164},"    - 0003_add_created_at: Added created_at field\n",[1050,4695,4696],{"class":1052,"line":1544},[1050,4697,4698],{"class":1164},"    - 0004_add_status: Added status field\n",[1050,4700,4701],{"class":1052,"line":1559},[1050,4702,4703],{"class":1164},"    - 0005_add_category: Added category relationship\n",[1050,4705,4706],{"class":1052,"line":1575},[1050,4707,1122],{"class":1164},[1050,4709,4710],{"class":1052,"line":1615},[1050,4711,4712],{"class":1164},"    Safe to apply on fresh databases.\n",[1050,4714,4715],{"class":1052,"line":1628},[1050,4716,4664],{"class":1164},[1050,4718,4719],{"class":1052,"line":1633},[1050,4720,1122],{"class":1164},[1050,4722,4723],{"class":1052,"line":1638},[1050,4724,4725],{"class":1164},"    initial = True\n",[1050,4727,4728],{"class":1052,"line":1643},[1050,4729,1122],{"class":1164},[1050,4731,4732],{"class":1052,"line":1649},[1050,4733,4734],{"class":1164},"    dependencies = [\n",[1050,4736,4737],{"class":1052,"line":1666},[1050,4738,4739],{"class":1164},"        ('auth', '0012_alter_user_first_name_max_length'),\n",[1050,4741,4742],{"class":1052,"line":1692},[1050,4743,1292],{"class":1164},[1050,4745,4746],{"class":1052,"line":1697},[1050,4747,1122],{"class":1164},[1050,4749,4750],{"class":1052,"line":1706},[1050,4751,4752],{"class":1164},"    replaces = [\n",[1050,4754,4755],{"class":1052,"line":1717},[1050,4756,4757],{"class":1164},"        ('blog', '0001_initial'),\n",[1050,4759,4760],{"class":1052,"line":1732},[1050,4761,4762],{"class":1164},"        ('blog', '0002_add_author'),\n",[1050,4764,4765],{"class":1052,"line":1748},[1050,4766,4767],{"class":1164},"        ('blog', '0003_add_created_at'),\n",[1050,4769,4770],{"class":1052,"line":1785},[1050,4771,4772],{"class":1164},"        ('blog', '0004_add_status'),\n",[1050,4774,4775],{"class":1052,"line":1790},[1050,4776,4777],{"class":1164},"        ('blog', '0005_add_category'),\n",[1050,4779,4780],{"class":1052,"line":1795},[1050,4781,1292],{"class":1164},[1050,4783,4784],{"class":1052,"line":1800},[1050,4785,1122],{"class":1164},[1050,4787,4788],{"class":1052,"line":1806},[1050,4789,4790],{"class":1164},"    operations = [\n",[1050,4792,4793],{"class":1052,"line":1812},[1050,4794,4795],{"class":1164},"        migrations.CreateModel(\n",[1050,4797,4798],{"class":1052,"line":1818},[1050,4799,4800],{"class":1164},"            name='Category',\n",[1050,4802,4803],{"class":1052,"line":1823},[1050,4804,4805],{"class":1164},"            fields=[\n",[1050,4807,4808],{"class":1052,"line":1840},[1050,4809,4810],{"class":1164},"                ('id', models.AutoField(primary_key=True)),\n",[1050,4812,4813],{"class":1052,"line":1854},[1050,4814,4815],{"class":1164},"                ('name', models.CharField(max_length=100)),\n",[1050,4817,4818],{"class":1052,"line":1859},[1050,4819,4820],{"class":1164},"                ('description', models.TextField(blank=True)),\n",[1050,4822,4823],{"class":1052,"line":1868},[1050,4824,1280],{"class":1164},[1050,4826,4827],{"class":1052,"line":1873},[1050,4828,1286],{"class":1164},[1050,4830,4831],{"class":1052,"line":1882},[1050,4832,4795],{"class":1164},[1050,4834,4835],{"class":1052,"line":1887},[1050,4836,4837],{"class":1164},"            name='Post',\n",[1050,4839,4840],{"class":1052,"line":1893},[1050,4841,4805],{"class":1164},[1050,4843,4844],{"class":1052,"line":1903},[1050,4845,4810],{"class":1164},[1050,4847,4848],{"class":1052,"line":1925},[1050,4849,4850],{"class":1164},"                ('title', models.CharField(max_length=200)),\n",[1050,4852,4853],{"class":1052,"line":1946},[1050,4854,4855],{"class":1164},"                ('content', models.TextField()),\n",[1050,4857,4858],{"class":1052,"line":1967},[1050,4859,4860],{"class":1164},"                ('author', models.ForeignKey(\n",[1050,4862,4863],{"class":1052,"line":1989},[1050,4864,4865],{"class":1164},"                    on_delete=django.db.models.deletion.CASCADE,\n",[1050,4867,4868],{"class":1052,"line":1994},[1050,4869,4870],{"class":1164},"                    to='auth.user'\n",[1050,4872,4873],{"class":1052,"line":1999},[1050,4874,4875],{"class":1164},"                )),\n",[1050,4877,4878],{"class":1052,"line":2008},[1050,4879,4880],{"class":1164},"                ('created_at', models.DateTimeField(auto_now_add=True)),\n",[1050,4882,4883],{"class":1052,"line":2014},[1050,4884,4885],{"class":1164},"                ('status', models.CharField(\n",[1050,4887,4888],{"class":1052,"line":2025},[1050,4889,4890],{"class":1164},"                    choices=[('draft', 'Draft'), ('published', 'Published')],\n",[1050,4892,4893],{"class":1052,"line":2040},[1050,4894,4895],{"class":1164},"                    default='draft',\n",[1050,4897,4898],{"class":1052,"line":2047},[1050,4899,4900],{"class":1164},"                    max_length=20\n",[1050,4902,4903],{"class":1052,"line":2076},[1050,4904,4875],{"class":1164},[1050,4906,4907],{"class":1052,"line":2105},[1050,4908,4909],{"class":1164},"                ('category', models.ForeignKey(\n",[1050,4911,4912],{"class":1052,"line":2126},[1050,4913,4865],{"class":1164},[1050,4915,4916],{"class":1052,"line":2167},[1050,4917,4918],{"class":1164},"                    to='blog.category'\n",[1050,4920,4921],{"class":1052,"line":2196},[1050,4922,4875],{"class":1164},[1050,4924,4925],{"class":1052,"line":2237},[1050,4926,1280],{"class":1164},[1050,4928,4929],{"class":1052,"line":2242},[1050,4930,4931],{"class":1164},"            options={\n",[1050,4933,4934],{"class":1052,"line":2247},[1050,4935,4936],{"class":1164},"                'ordering': ['-created_at'],\n",[1050,4938,4939],{"class":1052,"line":2252},[1050,4940,4941],{"class":1164},"            },\n",[1050,4943,4944],{"class":1052,"line":2257},[1050,4945,1286],{"class":1164},[1050,4947,4948],{"class":1052,"line":2263},[1050,4949,1292],{"class":1164},[1050,4951,4952],{"class":1052,"line":2269},[1050,4953,4954],{"class":1160},"'''\n",[1050,4956,4957],{"class":1052,"line":2274},[1050,4958,2445],{"class":1097},[1050,4960,4961,4963],{"class":1052,"line":2280},[1050,4962,3076],{"class":2366},[1050,4964,4965],{"class":1097}," squashed_migration_template\n",[1050,4967,4968],{"class":1052,"line":2286},[1050,4969,1122],{"class":1097},[1050,4971,4972,4974],{"class":1052,"line":3492},[1050,4973,4477],{"class":1077},[1050,4975,4480],{"class":3415},[1050,4977,4978,4980,4983],{"class":1052,"line":3515},[1050,4979,2326],{"class":1069},[1050,4981,4982],{"class":2423}," validate_squashed_migration",[1050,4984,4490],{"class":1077},[1050,4986,4987,4989,4992],{"class":1052,"line":3538},[1050,4988,2435],{"class":1843},[1050,4990,4991],{"class":1847},"Validate that squashed migration works correctly",[1050,4993,1851],{"class":1843},[1050,4995,4996],{"class":1052,"line":3543},[1050,4997,2445],{"class":1097},[1050,4999,5000,5003,5005],{"class":1052,"line":3549},[1050,5001,5002],{"class":1097},"        validation_steps ",[1050,5004,1101],{"class":1077},[1050,5006,1133],{"class":1077},[1050,5008,5009,5011,5014,5016],{"class":1052,"line":3555},[1050,5010,4517],{"class":1160},[1050,5012,5013],{"class":1164},"1. Test migration on fresh database",[1050,5015,3891],{"class":1160},[1050,5017,1170],{"class":1077},[1050,5019,5020,5022,5025,5027],{"class":1052,"line":3574},[1050,5021,4517],{"class":1160},[1050,5023,5024],{"class":1164},"2. Compare final schema with original migrations",[1050,5026,3891],{"class":1160},[1050,5028,1170],{"class":1077},[1050,5030,5031,5033,5036,5038],{"class":1052,"line":3579},[1050,5032,4517],{"class":1160},[1050,5034,5035],{"class":1164},"3. Verify all indexes and constraints are created",[1050,5037,3891],{"class":1160},[1050,5039,1170],{"class":1077},[1050,5041,5042,5044,5047,5049],{"class":1052,"line":3603},[1050,5043,4517],{"class":1160},[1050,5045,5046],{"class":1164},"4. Test migration rollback if applicable",[1050,5048,3891],{"class":1160},[1050,5050,1170],{"class":1077},[1050,5052,5053,5055,5058,5060],{"class":1052,"line":3613},[1050,5054,4517],{"class":1160},[1050,5056,5057],{"class":1164},"5. Check that data migrations are preserved",[1050,5059,3891],{"class":1160},[1050,5061,1170],{"class":1077},[1050,5063,5064,5066,5069,5071],{"class":1052,"line":3618},[1050,5065,4517],{"class":1160},[1050,5067,5068],{"class":1164},"6. Validate foreign key relationships",[1050,5070,3891],{"class":1160},[1050,5072,1170],{"class":1077},[1050,5074,5075,5077,5080],{"class":1052,"line":3628},[1050,5076,4517],{"class":1160},[1050,5078,5079],{"class":1164},"7. Test with different database backends if used",[1050,5081,4259],{"class":1160},[1050,5083,5084],{"class":1052,"line":3645},[1050,5085,4582],{"class":1077},[1050,5087,5088],{"class":1052,"line":3659},[1050,5089,2445],{"class":1097},[1050,5091,5092,5094],{"class":1052,"line":3673},[1050,5093,3076],{"class":2366},[1050,5095,5096],{"class":1097}," validation_steps\n",[1050,5098,5099],{"class":1052,"line":3678},[1050,5100,1122],{"class":1097},[1050,5102,5103,5105],{"class":1052,"line":3683},[1050,5104,4477],{"class":1077},[1050,5106,4480],{"class":3415},[1050,5108,5109,5111,5114],{"class":1052,"line":3689},[1050,5110,2326],{"class":1069},[1050,5112,5113],{"class":2423}," cleanup_after_squashing",[1050,5115,4490],{"class":1077},[1050,5117,5118,5120,5123],{"class":1052,"line":3698},[1050,5119,2435],{"class":1843},[1050,5121,5122],{"class":1847},"Clean up after successful squashing",[1050,5124,1851],{"class":1843},[1050,5126,5127],{"class":1052,"line":3703},[1050,5128,2445],{"class":1097},[1050,5130,5131,5134,5136],{"class":1052,"line":3728},[1050,5132,5133],{"class":1097},"        cleanup_steps ",[1050,5135,1101],{"class":1077},[1050,5137,1133],{"class":1077},[1050,5139,5140,5142,5145,5147],{"class":1052,"line":3751},[1050,5141,4517],{"class":1160},[1050,5143,5144],{"class":1164},"1. Remove original migration files (keep backup)",[1050,5146,3891],{"class":1160},[1050,5148,1170],{"class":1077},[1050,5150,5151,5153,5156,5158],{"class":1052,"line":3770},[1050,5152,4517],{"class":1160},[1050,5154,5155],{"class":1164},"2. Update migration dependencies in other apps if needed",[1050,5157,3891],{"class":1160},[1050,5159,1170],{"class":1077},[1050,5161,5162,5164,5167,5169],{"class":1052,"line":3775},[1050,5163,4517],{"class":1160},[1050,5165,5166],{"class":1164},"3. Test full migration process from scratch",[1050,5168,3891],{"class":1160},[1050,5170,1170],{"class":1077},[1050,5172,5173,5175,5178,5180],{"class":1052,"line":3786},[1050,5174,4517],{"class":1160},[1050,5176,5177],{"class":1164},"4. Update documentation",[1050,5179,3891],{"class":1160},[1050,5181,1170],{"class":1077},[1050,5183,5184,5186,5189,5191],{"class":1052,"line":3791},[1050,5185,4517],{"class":1160},[1050,5187,5188],{"class":1164},"5. Notify team of migration changes",[1050,5190,3891],{"class":1160},[1050,5192,1170],{"class":1077},[1050,5194,5195,5197,5200],{"class":1052,"line":3799},[1050,5196,4517],{"class":1160},[1050,5198,5199],{"class":1164},"6. Update deployment scripts if they reference specific migrations",[1050,5201,4259],{"class":1160},[1050,5203,5204],{"class":1052,"line":3820},[1050,5205,4582],{"class":1077},[1050,5207,5208],{"class":1052,"line":3840},[1050,5209,2445],{"class":1097},[1050,5211,5212,5214],{"class":1052,"line":3851},[1050,5213,3076],{"class":2366},[1050,5215,5216],{"class":1097}," cleanup_steps\n",[1050,5218,5219],{"class":1052,"line":3872},[1050,5220,1299],{"emptyLinePlaceholder":1298},[1050,5222,5223],{"class":1052,"line":3901},[1050,5224,5225],{"class":1056},"# Advanced squashing techniques\n",[1050,5227,5228,5230,5233],{"class":1052,"line":3909},[1050,5229,1070],{"class":1069},[1050,5231,5232],{"class":1073}," AdvancedSquashingTechniques",[1050,5234,2308],{"class":1077},[1050,5236,5237,5239,5242],{"class":1052,"line":3914},[1050,5238,1844],{"class":1843},[1050,5240,5241],{"class":1847},"Advanced techniques for migration squashing",[1050,5243,1851],{"class":1843},[1050,5245,5246],{"class":1052,"line":3941},[1050,5247,1122],{"class":1097},[1050,5249,5250,5252],{"class":1052,"line":3946},[1050,5251,4477],{"class":1077},[1050,5253,4480],{"class":3415},[1050,5255,5256,5258,5261],{"class":1052,"line":3952},[1050,5257,2326],{"class":1069},[1050,5259,5260],{"class":2423}," squash_with_data_preservation",[1050,5262,4490],{"class":1077},[1050,5264,5265,5267,5270],{"class":1052,"line":3966},[1050,5266,2435],{"class":1843},[1050,5268,5269],{"class":1847},"Squash migrations while preserving data migrations",[1050,5271,1851],{"class":1843},[1050,5273,5274],{"class":1052,"line":3997},[1050,5275,2445],{"class":1097},[1050,5277,5278,5281,5284],{"class":1052,"line":4002},[1050,5279,5280],{"class":1069},"        def",[1050,5282,5283],{"class":2423}," create_data_preserving_squash",[1050,5285,4490],{"class":1077},[1050,5287,5288,5291,5294],{"class":1052,"line":4020},[1050,5289,5290],{"class":1843},"            \"\"\"",[1050,5292,5293],{"class":1847},"Create squashed migration that preserves data operations",[1050,5295,1851],{"class":1843},[1050,5297,5298],{"class":1052,"line":4042},[1050,5299,2968],{"class":1097},[1050,5301,5302],{"class":1052,"line":4048},[1050,5303,5304],{"class":1056},"            # When squashing migrations with RunPython operations,\n",[1050,5306,5307],{"class":1052,"line":4054},[1050,5308,5309],{"class":1056},"            # you need to preserve the data migration logic\n",[1050,5311,5312],{"class":1052,"line":4074},[1050,5313,2968],{"class":1097},[1050,5315,5316,5319,5322,5324,5327,5329,5332],{"class":1052,"line":4094},[1050,5317,5318],{"class":1069},"            def",[1050,5320,5321],{"class":2423}," combined_data_migration",[1050,5323,1078],{"class":1077},[1050,5325,5326],{"class":2341},"apps",[1050,5328,1195],{"class":1077},[1050,5330,5331],{"class":2341}," schema_editor",[1050,5333,1091],{"class":1077},[1050,5335,5336,5339,5342],{"class":1052,"line":4112},[1050,5337,5338],{"class":1843},"                \"\"\"",[1050,5340,5341],{"class":1847},"Combined data migration from multiple migrations",[1050,5343,1851],{"class":1843},[1050,5345,5346],{"class":1052,"line":4118},[1050,5347,4045],{"class":1097},[1050,5349,5350,5353,5355,5358,5360,5363,5365,5367,5369,5371,5373,5375,5377,5379],{"class":1052,"line":4123},[1050,5351,5352],{"class":1097},"                Post ",[1050,5354,1101],{"class":1077},[1050,5356,5357],{"class":1097}," apps",[1050,5359,1085],{"class":1077},[1050,5361,5362],{"class":1144},"get_model",[1050,5364,1078],{"class":1077},[1050,5366,1161],{"class":1160},[1050,5368,1337],{"class":1164},[1050,5370,1161],{"class":1160},[1050,5372,1195],{"class":1077},[1050,5374,1344],{"class":1160},[1050,5376,1165],{"class":1164},[1050,5378,1161],{"class":1160},[1050,5380,2412],{"class":1077},[1050,5382,5383],{"class":1052,"line":4142},[1050,5384,4045],{"class":1097},[1050,5386,5387],{"class":1052,"line":4161},[1050,5388,5389],{"class":1056},"                # Data migration from 0002: Set default authors\n",[1050,5391,5392,5395,5397,5400,5402,5405,5407,5410,5412,5414,5417,5420],{"class":1052,"line":4177},[1050,5393,5394],{"class":1097},"                Post",[1050,5396,1085],{"class":1077},[1050,5398,5399],{"class":1609},"objects",[1050,5401,1085],{"class":1077},[1050,5403,5404],{"class":1144},"filter",[1050,5406,1078],{"class":1077},[1050,5408,5409],{"class":1154},"author__isnull",[1050,5411,1101],{"class":1077},[1050,5413,1213],{"class":1104},[1050,5415,5416],{"class":1077},").",[1050,5418,5419],{"class":1144},"update",[1050,5421,1148],{"class":1077},[1050,5423,5424,5427,5429,5431],{"class":1052,"line":4182},[1050,5425,5426],{"class":1154},"                    author_id",[1050,5428,1101],{"class":1077},[1050,5430,2606],{"class":1247},[1050,5432,5433],{"class":1056},"  # Default admin user\n",[1050,5435,5436],{"class":1052,"line":4187},[1050,5437,5438],{"class":1077},"                )\n",[1050,5440,5441],{"class":1052,"line":4217},[1050,5442,4045],{"class":1097},[1050,5444,5445],{"class":1052,"line":4236},[1050,5446,5447],{"class":1056},"                # Data migration from 0004: Set default status\n",[1050,5449,5450,5452,5454,5456,5458,5460,5462,5465,5467,5469,5471,5473],{"class":1052,"line":4262},[1050,5451,5394],{"class":1097},[1050,5453,1085],{"class":1077},[1050,5455,5399],{"class":1609},[1050,5457,1085],{"class":1077},[1050,5459,5404],{"class":1144},[1050,5461,1078],{"class":1077},[1050,5463,5464],{"class":1154},"status__isnull",[1050,5466,1101],{"class":1077},[1050,5468,1213],{"class":1104},[1050,5470,5416],{"class":1077},[1050,5472,5419],{"class":1144},[1050,5474,1148],{"class":1077},[1050,5476,5477,5480,5482,5484,5486],{"class":1052,"line":4267},[1050,5478,5479],{"class":1154},"                    status",[1050,5481,1101],{"class":1077},[1050,5483,1161],{"class":1160},[1050,5485,1778],{"class":1164},[1050,5487,2906],{"class":1160},[1050,5489,5490],{"class":1052,"line":4272},[1050,5491,5438],{"class":1077},[1050,5493,5494],{"class":1052,"line":4278},[1050,5495,4045],{"class":1097},[1050,5497,5498],{"class":1052,"line":4291},[1050,5499,5500],{"class":1056},"                # Data migration from 0005: Assign default category\n",[1050,5502,5503,5506,5508,5510,5512,5514,5516,5518,5520,5522,5524,5526,5529,5531],{"class":1052,"line":4322},[1050,5504,5505],{"class":1097},"                Category ",[1050,5507,1101],{"class":1077},[1050,5509,5357],{"class":1097},[1050,5511,1085],{"class":1077},[1050,5513,5362],{"class":1144},[1050,5515,1078],{"class":1077},[1050,5517,1161],{"class":1160},[1050,5519,1337],{"class":1164},[1050,5521,1161],{"class":1160},[1050,5523,1195],{"class":1077},[1050,5525,1344],{"class":1160},[1050,5527,5528],{"class":1164},"Category",[1050,5530,1161],{"class":1160},[1050,5532,2412],{"class":1077},[1050,5534,5535,5538,5540,5543,5545,5548,5550,5552,5554,5557],{"class":1052,"line":4327},[1050,5536,5537],{"class":1097},"                default_category",[1050,5539,1195],{"class":1077},[1050,5541,5542],{"class":1097}," created ",[1050,5544,1101],{"class":1077},[1050,5546,5547],{"class":1097}," Category",[1050,5549,1085],{"class":1077},[1050,5551,5399],{"class":1609},[1050,5553,1085],{"class":1077},[1050,5555,5556],{"class":1144},"get_or_create",[1050,5558,1148],{"class":1077},[1050,5560,5561,5564,5566,5568,5571,5573],{"class":1052,"line":4351},[1050,5562,5563],{"class":1154},"                    name",[1050,5565,1101],{"class":1077},[1050,5567,1161],{"class":1160},[1050,5569,5570],{"class":1164},"General",[1050,5572,1161],{"class":1160},[1050,5574,1170],{"class":1077},[1050,5576,5577,5580,5583,5585,5588,5590,5592,5594,5597,5599],{"class":1052,"line":4370},[1050,5578,5579],{"class":1154},"                    defaults",[1050,5581,5582],{"class":1077},"={",[1050,5584,1161],{"class":1160},[1050,5586,5587],{"class":1164},"description",[1050,5589,1161],{"class":1160},[1050,5591,2468],{"class":1077},[1050,5593,1344],{"class":1160},[1050,5595,5596],{"class":1164},"General posts",[1050,5598,1161],{"class":1160},[1050,5600,5601],{"class":1077},"}\n",[1050,5603,5604],{"class":1052,"line":4389},[1050,5605,5438],{"class":1077},[1050,5607,5608],{"class":1052,"line":4423},[1050,5609,4045],{"class":1097},[1050,5611,5612,5614,5616,5618,5620,5622,5624,5627,5629,5631,5633,5635],{"class":1052,"line":4428},[1050,5613,5394],{"class":1097},[1050,5615,1085],{"class":1077},[1050,5617,5399],{"class":1609},[1050,5619,1085],{"class":1077},[1050,5621,5404],{"class":1144},[1050,5623,1078],{"class":1077},[1050,5625,5626],{"class":1154},"category__isnull",[1050,5628,1101],{"class":1077},[1050,5630,1213],{"class":1104},[1050,5632,5416],{"class":1077},[1050,5634,5419],{"class":1144},[1050,5636,1148],{"class":1077},[1050,5638,5639,5642,5644],{"class":1052,"line":4433},[1050,5640,5641],{"class":1154},"                    category",[1050,5643,1101],{"class":1077},[1050,5645,5646],{"class":1144},"default_category\n",[1050,5648,5650],{"class":1052,"line":5649},164,[1050,5651,5438],{"class":1077},[1050,5653,5655],{"class":1052,"line":5654},165,[1050,5656,2968],{"class":1097},[1050,5658,5660,5662,5665,5667,5669,5671,5673],{"class":1052,"line":5659},166,[1050,5661,5318],{"class":1069},[1050,5663,5664],{"class":2423}," reverse_combined_data_migration",[1050,5666,1078],{"class":1077},[1050,5668,5326],{"class":2341},[1050,5670,1195],{"class":1077},[1050,5672,5331],{"class":2341},[1050,5674,1091],{"class":1077},[1050,5676,5678,5680,5683],{"class":1052,"line":5677},167,[1050,5679,5338],{"class":1843},[1050,5681,5682],{"class":1847},"Reverse the combined data migration",[1050,5684,1851],{"class":1843},[1050,5686,5688],{"class":1052,"line":5687},168,[1050,5689,4045],{"class":1097},[1050,5691,5693],{"class":1052,"line":5692},169,[1050,5694,5695],{"class":1056},"                # Usually just clear the fields back to null\n",[1050,5697,5699,5701,5703,5705,5707,5709,5711,5713,5715,5717,5719,5721,5723,5725],{"class":1052,"line":5698},170,[1050,5700,5352],{"class":1097},[1050,5702,1101],{"class":1077},[1050,5704,5357],{"class":1097},[1050,5706,1085],{"class":1077},[1050,5708,5362],{"class":1144},[1050,5710,1078],{"class":1077},[1050,5712,1161],{"class":1160},[1050,5714,1337],{"class":1164},[1050,5716,1161],{"class":1160},[1050,5718,1195],{"class":1077},[1050,5720,1344],{"class":1160},[1050,5722,1165],{"class":1164},[1050,5724,1161],{"class":1160},[1050,5726,2412],{"class":1077},[1050,5728,5730,5732,5734,5736,5738,5740],{"class":1052,"line":5729},171,[1050,5731,5394],{"class":1097},[1050,5733,1085],{"class":1077},[1050,5735,5399],{"class":1609},[1050,5737,1085],{"class":1077},[1050,5739,5419],{"class":1144},[1050,5741,1148],{"class":1077},[1050,5743,5745,5748,5750,5753],{"class":1052,"line":5744},172,[1050,5746,5747],{"class":1154},"                    author",[1050,5749,1101],{"class":1077},[1050,5751,5752],{"class":1104},"None",[1050,5754,1170],{"class":1077},[1050,5756,5758,5760,5762,5764],{"class":1052,"line":5757},173,[1050,5759,5479],{"class":1154},[1050,5761,1101],{"class":1077},[1050,5763,5752],{"class":1104},[1050,5765,1170],{"class":1077},[1050,5767,5769,5771,5773],{"class":1052,"line":5768},174,[1050,5770,5641],{"class":1154},[1050,5772,1101],{"class":1077},[1050,5774,5775],{"class":1104},"None\n",[1050,5777,5779],{"class":1052,"line":5778},175,[1050,5780,5438],{"class":1077},[1050,5782,5784],{"class":1052,"line":5783},176,[1050,5785,2968],{"class":1097},[1050,5787,5789],{"class":1052,"line":5788},177,[1050,5790,5791],{"class":1056},"            # The squashed migration would include:\n",[1050,5793,5795,5798,5800],{"class":1052,"line":5794},178,[1050,5796,5797],{"class":1097},"            squashed_operations ",[1050,5799,1101],{"class":1077},[1050,5801,1133],{"class":1077},[1050,5803,5805],{"class":1052,"line":5804},179,[1050,5806,5807],{"class":1056},"                # Schema operations (combined)\n",[1050,5809,5811,5814,5816,5818,5820,5822,5824,5826,5828,5830,5832,5835,5838,5842],{"class":1052,"line":5810},180,[1050,5812,5813],{"class":1097},"                migrations",[1050,5815,1085],{"class":1077},[1050,5817,1145],{"class":1144},[1050,5819,1078],{"class":1077},[1050,5821,3508],{"class":1154},[1050,5823,1101],{"class":1077},[1050,5825,1161],{"class":1160},[1050,5827,5528],{"class":1164},[1050,5829,1161],{"class":1160},[1050,5831,1195],{"class":1077},[1050,5833,5834],{"class":1154}," fields",[1050,5836,5837],{"class":1077},"=[",[1050,5839,5841],{"class":5840},"s6DHA","...",[1050,5843,5844],{"class":1077},"]),\n",[1050,5846,5848,5850,5852,5854,5856,5858,5860,5862,5864,5866,5868,5870,5872,5874],{"class":1052,"line":5847},181,[1050,5849,5813],{"class":1097},[1050,5851,1085],{"class":1077},[1050,5853,1145],{"class":1144},[1050,5855,1078],{"class":1077},[1050,5857,3508],{"class":1154},[1050,5859,1101],{"class":1077},[1050,5861,1161],{"class":1160},[1050,5863,1165],{"class":1164},[1050,5865,1161],{"class":1160},[1050,5867,1195],{"class":1077},[1050,5869,5834],{"class":1154},[1050,5871,5837],{"class":1077},[1050,5873,5841],{"class":5840},[1050,5875,5844],{"class":1077},[1050,5877,5879],{"class":1052,"line":5878},182,[1050,5880,4045],{"class":1097},[1050,5882,5884],{"class":1052,"line":5883},183,[1050,5885,5886],{"class":1056},"                # Combined data migration\n",[1050,5888,5890,5892,5894,5896],{"class":1052,"line":5889},184,[1050,5891,5813],{"class":1097},[1050,5893,1085],{"class":1077},[1050,5895,4067],{"class":1144},[1050,5897,1148],{"class":1077},[1050,5899,5901,5904,5906,5909],{"class":1052,"line":5900},185,[1050,5902,5903],{"class":1154},"                    code",[1050,5905,1101],{"class":1077},[1050,5907,5908],{"class":1144},"combined_data_migration",[1050,5910,1170],{"class":1077},[1050,5912,5914,5917,5919,5922],{"class":1052,"line":5913},186,[1050,5915,5916],{"class":1154},"                    reverse_code",[1050,5918,1101],{"class":1077},[1050,5920,5921],{"class":1144},"reverse_combined_data_migration",[1050,5923,1170],{"class":1077},[1050,5925,5927],{"class":1052,"line":5926},187,[1050,5928,5929],{"class":1077},"                ),\n",[1050,5931,5933],{"class":1052,"line":5932},188,[1050,5934,5935],{"class":1077},"            ]\n",[1050,5937,5939],{"class":1052,"line":5938},189,[1050,5940,2968],{"class":1097},[1050,5942,5944,5946],{"class":1052,"line":5943},190,[1050,5945,3394],{"class":2366},[1050,5947,5948],{"class":1097}," squashed_operations\n",[1050,5950,5952],{"class":1052,"line":5951},191,[1050,5953,2445],{"class":1097},[1050,5955,5957,5959],{"class":1052,"line":5956},192,[1050,5958,3076],{"class":2366},[1050,5960,5961],{"class":1097}," create_data_preserving_squash\n",[1050,5963,5965],{"class":1052,"line":5964},193,[1050,5966,1122],{"class":1097},[1050,5968,5970,5972],{"class":1052,"line":5969},194,[1050,5971,4477],{"class":1077},[1050,5973,4480],{"class":3415},[1050,5975,5977,5979,5982],{"class":1052,"line":5976},195,[1050,5978,2326],{"class":1069},[1050,5980,5981],{"class":2423}," conditional_squashing",[1050,5983,4490],{"class":1077},[1050,5985,5987,5989,5992],{"class":1052,"line":5986},196,[1050,5988,2435],{"class":1843},[1050,5990,5991],{"class":1847},"Squash migrations conditionally based on environment",[1050,5993,1851],{"class":1843},[1050,5995,5997],{"class":1052,"line":5996},197,[1050,5998,2445],{"class":1097},[1050,6000,6002,6004,6007,6009,6011,6013,6015],{"class":1052,"line":6001},198,[1050,6003,5280],{"class":1069},[1050,6005,6006],{"class":2423}," conditional_squash_migration",[1050,6008,1078],{"class":1077},[1050,6010,5326],{"class":2341},[1050,6012,1195],{"class":1077},[1050,6014,5331],{"class":2341},[1050,6016,1091],{"class":1077},[1050,6018,6020,6022,6025],{"class":1052,"line":6019},199,[1050,6021,5290],{"class":1843},[1050,6023,6024],{"class":1847},"Migration that behaves differently based on existing data",[1050,6026,1851],{"class":1843},[1050,6028,6030],{"class":1052,"line":6029},200,[1050,6031,2968],{"class":1097},[1050,6033,6035,6038,6040,6042,6044,6046,6048,6050,6052,6054,6056,6058,6060,6062],{"class":1052,"line":6034},201,[1050,6036,6037],{"class":1097},"            Post ",[1050,6039,1101],{"class":1077},[1050,6041,5357],{"class":1097},[1050,6043,1085],{"class":1077},[1050,6045,5362],{"class":1144},[1050,6047,1078],{"class":1077},[1050,6049,1161],{"class":1160},[1050,6051,1337],{"class":1164},[1050,6053,1161],{"class":1160},[1050,6055,1195],{"class":1077},[1050,6057,1344],{"class":1160},[1050,6059,1165],{"class":1164},[1050,6061,1161],{"class":1160},[1050,6063,2412],{"class":1077},[1050,6065,6067],{"class":1052,"line":6066},202,[1050,6068,2968],{"class":1097},[1050,6070,6072],{"class":1052,"line":6071},203,[1050,6073,6074],{"class":1056},"            # Check if this is a fresh installation or existing data\n",[1050,6076,6078,6081,6083,6086,6088,6090,6092,6095],{"class":1052,"line":6077},204,[1050,6079,6080],{"class":1097},"            existing_posts ",[1050,6082,1101],{"class":1077},[1050,6084,6085],{"class":1097}," Post",[1050,6087,1085],{"class":1077},[1050,6089,5399],{"class":1609},[1050,6091,1085],{"class":1077},[1050,6093,6094],{"class":1144},"exists",[1050,6096,2626],{"class":1077},[1050,6098,6100],{"class":1052,"line":6099},205,[1050,6101,2968],{"class":1097},[1050,6103,6105,6107,6109,6112],{"class":1052,"line":6104},206,[1050,6106,2562],{"class":2366},[1050,6108,3385],{"class":2577},[1050,6110,6111],{"class":1097}," existing_posts",[1050,6113,2308],{"class":1077},[1050,6115,6117],{"class":1052,"line":6116},207,[1050,6118,6119],{"class":1056},"                # Fresh installation - create everything at once\n",[1050,6121,6123,6126,6128,6130,6133,6135],{"class":1052,"line":6122},208,[1050,6124,6125],{"class":2329},"                print",[1050,6127,1078],{"class":1077},[1050,6129,3891],{"class":1160},[1050,6131,6132],{"class":1164},"Fresh installation detected - creating optimized schema",[1050,6134,3891],{"class":1160},[1050,6136,2412],{"class":1077},[1050,6138,6140],{"class":1052,"line":6139},209,[1050,6141,4045],{"class":1097},[1050,6143,6145],{"class":1052,"line":6144},210,[1050,6146,6147],{"class":1056},"                # All schema operations are handled by the CreateModel operations\n",[1050,6149,6151],{"class":1052,"line":6150},211,[1050,6152,6153],{"class":1056},"                # No additional data migrations needed\n",[1050,6155,6157],{"class":1052,"line":6156},212,[1050,6158,4045],{"class":1097},[1050,6160,6162,6164],{"class":1052,"line":6161},213,[1050,6163,3234],{"class":2366},[1050,6165,2308],{"class":1077},[1050,6167,6169],{"class":1052,"line":6168},214,[1050,6170,6171],{"class":1056},"                # Existing installation - need to handle data carefully\n",[1050,6173,6175,6177,6179,6181,6184,6186],{"class":1052,"line":6174},215,[1050,6176,6125],{"class":2329},[1050,6178,1078],{"class":1077},[1050,6180,3891],{"class":1160},[1050,6182,6183],{"class":1164},"Existing data detected - running compatibility migrations",[1050,6185,3891],{"class":1160},[1050,6187,2412],{"class":1077},[1050,6189,6191],{"class":1052,"line":6190},216,[1050,6192,4045],{"class":1097},[1050,6194,6196],{"class":1052,"line":6195},217,[1050,6197,6198],{"class":1056},"                # Run data migrations that would have been in original migrations\n",[1050,6200,6202],{"class":1052,"line":6201},218,[1050,6203,6204],{"class":1056},"                # This ensures existing installations work correctly\n",[1050,6206,6208],{"class":1052,"line":6207},219,[1050,6209,4045],{"class":1097},[1050,6211,6213],{"class":1052,"line":6212},220,[1050,6214,6215],{"class":1056},"                # Example: Populate fields that were added in separate migrations\n",[1050,6217,6219,6221,6223,6225,6227,6229,6231,6233,6235,6237,6239,6241,6243,6245,6247,6249,6251,6253],{"class":1052,"line":6218},221,[1050,6220,5394],{"class":1097},[1050,6222,1085],{"class":1077},[1050,6224,5399],{"class":1609},[1050,6226,1085],{"class":1077},[1050,6228,5404],{"class":1144},[1050,6230,1078],{"class":1077},[1050,6232,5464],{"class":1154},[1050,6234,1101],{"class":1077},[1050,6236,1213],{"class":1104},[1050,6238,5416],{"class":1077},[1050,6240,5419],{"class":1144},[1050,6242,1078],{"class":1077},[1050,6244,1741],{"class":1154},[1050,6246,1101],{"class":1077},[1050,6248,1161],{"class":1160},[1050,6250,1778],{"class":1164},[1050,6252,1161],{"class":1160},[1050,6254,2412],{"class":1077},[1050,6256,6258,6260,6262,6264,6266,6268,6270,6272,6274,6276,6278,6280,6282,6285,6287,6289],{"class":1052,"line":6257},222,[1050,6259,5394],{"class":1097},[1050,6261,1085],{"class":1077},[1050,6263,5399],{"class":1609},[1050,6265,1085],{"class":1077},[1050,6267,5404],{"class":1144},[1050,6269,1078],{"class":1077},[1050,6271,5409],{"class":1154},[1050,6273,1101],{"class":1077},[1050,6275,1213],{"class":1104},[1050,6277,5416],{"class":1077},[1050,6279,5419],{"class":1144},[1050,6281,1078],{"class":1077},[1050,6283,6284],{"class":1154},"author_id",[1050,6286,1101],{"class":1077},[1050,6288,2606],{"class":1247},[1050,6290,2412],{"class":1077},[1050,6292,6294],{"class":1052,"line":6293},223,[1050,6295,2445],{"class":1097},[1050,6297,6299,6301],{"class":1052,"line":6298},224,[1050,6300,3076],{"class":2366},[1050,6302,6303],{"class":1097}," conditional_squash_migration\n",[1050,6305,6307],{"class":1052,"line":6306},225,[1050,6308,1122],{"class":1097},[1050,6310,6312,6314],{"class":1052,"line":6311},226,[1050,6313,4477],{"class":1077},[1050,6315,4480],{"class":3415},[1050,6317,6319,6321,6324],{"class":1052,"line":6318},227,[1050,6320,2326],{"class":1069},[1050,6322,6323],{"class":2423}," optimize_squashed_operations",[1050,6325,4490],{"class":1077},[1050,6327,6329,6331,6334],{"class":1052,"line":6328},228,[1050,6330,2435],{"class":1843},[1050,6332,6333],{"class":1847},"Optimize operations in squashed migrations",[1050,6335,1851],{"class":1843},[1050,6337,6339],{"class":1052,"line":6338},229,[1050,6340,2445],{"class":1097},[1050,6342,6344,6346,6349,6351,6354],{"class":1052,"line":6343},230,[1050,6345,5280],{"class":1069},[1050,6347,6348],{"class":2423}," optimize_operations",[1050,6350,1078],{"class":1077},[1050,6352,6353],{"class":2341},"original_operations",[1050,6355,1091],{"class":1077},[1050,6357,6359,6361,6364],{"class":1052,"line":6358},231,[1050,6360,5290],{"class":1843},[1050,6362,6363],{"class":1847},"Optimize a list of migration operations",[1050,6365,1851],{"class":1843},[1050,6367,6369],{"class":1052,"line":6368},232,[1050,6370,2968],{"class":1097},[1050,6372,6374,6377,6379],{"class":1052,"line":6373},233,[1050,6375,6376],{"class":1097},"            optimized ",[1050,6378,1101],{"class":1077},[1050,6380,1116],{"class":1077},[1050,6382,6384],{"class":1052,"line":6383},234,[1050,6385,2968],{"class":1097},[1050,6387,6389],{"class":1052,"line":6388},235,[1050,6390,6391],{"class":1056},"            # Group operations by model\n",[1050,6393,6395,6398,6400],{"class":1052,"line":6394},236,[1050,6396,6397],{"class":1097},"            operations_by_model ",[1050,6399,1101],{"class":1077},[1050,6401,6402],{"class":1077}," {}\n",[1050,6404,6406],{"class":1052,"line":6405},237,[1050,6407,2968],{"class":1097},[1050,6409,6411,6413,6415,6417,6420],{"class":1052,"line":6410},238,[1050,6412,4005],{"class":2366},[1050,6414,3429],{"class":1097},[1050,6416,2538],{"class":2366},[1050,6418,6419],{"class":1097}," original_operations",[1050,6421,2308],{"class":1077},[1050,6423,6425,6428,6430,6433,6435,6437,6439,6441,6443,6445,6447,6450,6452,6455,6457,6459,6461,6463,6465,6467,6469,6471,6473],{"class":1052,"line":6424},239,[1050,6426,6427],{"class":1097},"                model_name ",[1050,6429,1101],{"class":1077},[1050,6431,6432],{"class":2329}," getattr",[1050,6434,1078],{"class":1077},[1050,6436,3452],{"class":1144},[1050,6438,1195],{"class":1077},[1050,6440,1344],{"class":1160},[1050,6442,3459],{"class":1164},[1050,6444,1161],{"class":1160},[1050,6446,1195],{"class":1077},[1050,6448,6449],{"class":1104}," None",[1050,6451,2676],{"class":1077},[1050,6453,6454],{"class":2577}," or",[1050,6456,6432],{"class":2329},[1050,6458,1078],{"class":1077},[1050,6460,3452],{"class":1144},[1050,6462,1195],{"class":1077},[1050,6464,1344],{"class":1160},[1050,6466,3508],{"class":1164},[1050,6468,1161],{"class":1160},[1050,6470,1195],{"class":1077},[1050,6472,6449],{"class":1104},[1050,6474,2412],{"class":1077},[1050,6476,6478],{"class":1052,"line":6477},240,[1050,6479,4045],{"class":1097},[1050,6481,6483,6485,6488],{"class":1052,"line":6482},241,[1050,6484,3241],{"class":2366},[1050,6486,6487],{"class":1097}," model_name",[1050,6489,2308],{"class":1077},[1050,6491,6493,6496,6499,6502,6505,6508],{"class":1052,"line":6492},242,[1050,6494,6495],{"class":2366},"                    if",[1050,6497,6498],{"class":1097}," model_name ",[1050,6500,6501],{"class":2577},"not",[1050,6503,6504],{"class":2577}," in",[1050,6506,6507],{"class":1097}," operations_by_model",[1050,6509,2308],{"class":1077},[1050,6511,6513,6516,6518,6520,6522,6524],{"class":1052,"line":6512},243,[1050,6514,6515],{"class":1097},"                        operations_by_model",[1050,6517,2568],{"class":1077},[1050,6519,3459],{"class":1097},[1050,6521,2574],{"class":1077},[1050,6523,2358],{"class":1077},[1050,6525,1116],{"class":1077},[1050,6527,6529,6532,6534,6536,6538,6540,6542,6544],{"class":1052,"line":6528},244,[1050,6530,6531],{"class":1097},"                    operations_by_model",[1050,6533,2568],{"class":1077},[1050,6535,3459],{"class":1097},[1050,6537,2700],{"class":1077},[1050,6539,2596],{"class":1144},[1050,6541,1078],{"class":1077},[1050,6543,3452],{"class":1144},[1050,6545,2412],{"class":1077},[1050,6547,6549,6552],{"class":1052,"line":6548},245,[1050,6550,6551],{"class":2366},"                else",[1050,6553,2308],{"class":1077},[1050,6555,6557],{"class":1052,"line":6556},246,[1050,6558,6559],{"class":1056},"                    # Non-model operations (like RunPython)\n",[1050,6561,6563,6566,6568,6570,6572,6574],{"class":1052,"line":6562},247,[1050,6564,6565],{"class":1097},"                    optimized",[1050,6567,1085],{"class":1077},[1050,6569,2596],{"class":1144},[1050,6571,1078],{"class":1077},[1050,6573,3452],{"class":1144},[1050,6575,2412],{"class":1077},[1050,6577,6579],{"class":1052,"line":6578},248,[1050,6580,2968],{"class":1097},[1050,6582,6584],{"class":1052,"line":6583},249,[1050,6585,6586],{"class":1056},"            # Optimize operations for each model\n",[1050,6588,6590,6592,6594,6596,6599,6601,6603,6605,6608],{"class":1052,"line":6589},250,[1050,6591,4005],{"class":2366},[1050,6593,6487],{"class":1097},[1050,6595,1195],{"class":1077},[1050,6597,6598],{"class":1097}," model_operations ",[1050,6600,2538],{"class":2366},[1050,6602,6507],{"class":1097},[1050,6604,1085],{"class":1077},[1050,6606,6607],{"class":1144},"items",[1050,6609,4490],{"class":1077},[1050,6611,6613,6616,6618,6621,6623,6626],{"class":1052,"line":6612},251,[1050,6614,6615],{"class":1097},"                optimized_model_ops ",[1050,6617,1101],{"class":1077},[1050,6619,6620],{"class":1144}," optimize_model_operations",[1050,6622,1078],{"class":1077},[1050,6624,6625],{"class":1144},"model_operations",[1050,6627,2412],{"class":1077},[1050,6629,6631,6634,6636,6639,6641,6644],{"class":1052,"line":6630},252,[1050,6632,6633],{"class":1097},"                optimized",[1050,6635,1085],{"class":1077},[1050,6637,6638],{"class":1144},"extend",[1050,6640,1078],{"class":1077},[1050,6642,6643],{"class":1144},"optimized_model_ops",[1050,6645,2412],{"class":1077},[1050,6647,6649],{"class":1052,"line":6648},253,[1050,6650,2968],{"class":1097},[1050,6652,6654,6656],{"class":1052,"line":6653},254,[1050,6655,3394],{"class":2366},[1050,6657,6658],{"class":1097}," optimized\n",[1050,6660,6662],{"class":1052,"line":6661},255,[1050,6663,2445],{"class":1097},[1050,6665,6667,6669,6671,6673,6675],{"class":1052,"line":6666},256,[1050,6668,5280],{"class":1069},[1050,6670,6620],{"class":2423},[1050,6672,1078],{"class":1077},[1050,6674,3438],{"class":2341},[1050,6676,1091],{"class":1077},[1050,6678,6680,6682,6685],{"class":1052,"line":6679},257,[1050,6681,5290],{"class":1843},[1050,6683,6684],{"class":1847},"Optimize operations for a single model",[1050,6686,1851],{"class":1843},[1050,6688,6690],{"class":1052,"line":6689},258,[1050,6691,2968],{"class":1097},[1050,6693,6695],{"class":1052,"line":6694},259,[1050,6696,6697],{"class":1056},"            # Look for patterns that can be optimized\n",[1050,6699,6701],{"class":1052,"line":6700},260,[1050,6702,2968],{"class":1097},[1050,6704,6706],{"class":1052,"line":6705},261,[1050,6707,6708],{"class":1056},"            # Pattern 1: CreateModel followed by AddField operations\n",[1050,6710,6712,6715,6717],{"class":1052,"line":6711},262,[1050,6713,6714],{"class":1097},"            create_model_op ",[1050,6716,1101],{"class":1077},[1050,6718,6719],{"class":1104}," None\n",[1050,6721,6723,6726,6728],{"class":1052,"line":6722},263,[1050,6724,6725],{"class":1097},"            add_field_ops ",[1050,6727,1101],{"class":1077},[1050,6729,1116],{"class":1077},[1050,6731,6733,6736,6738],{"class":1052,"line":6732},264,[1050,6734,6735],{"class":1097},"            other_ops ",[1050,6737,1101],{"class":1077},[1050,6739,1116],{"class":1077},[1050,6741,6743],{"class":1052,"line":6742},265,[1050,6744,2968],{"class":1097},[1050,6746,6748,6750,6753,6755,6758],{"class":1052,"line":6747},266,[1050,6749,4005],{"class":2366},[1050,6751,6752],{"class":1097}," op ",[1050,6754,2538],{"class":2366},[1050,6756,6757],{"class":1097}," operations",[1050,6759,2308],{"class":1077},[1050,6761,6763,6765,6768,6770,6772,6774,6777,6779,6781,6783,6785],{"class":1052,"line":6762},267,[1050,6764,3241],{"class":2366},[1050,6766,6767],{"class":1097}," op",[1050,6769,1085],{"class":1077},[1050,6771,4034],{"class":4033},[1050,6773,1085],{"class":1077},[1050,6775,6776],{"class":4033},"__name__",[1050,6778,2578],{"class":2577},[1050,6780,1344],{"class":1160},[1050,6782,1145],{"class":1164},[1050,6784,1161],{"class":1160},[1050,6786,2308],{"class":1077},[1050,6788,6790,6793,6795],{"class":1052,"line":6789},268,[1050,6791,6792],{"class":1097},"                    create_model_op ",[1050,6794,1101],{"class":1077},[1050,6796,6797],{"class":1097}," op\n",[1050,6799,6801,6803,6805,6807,6809,6811,6813,6815,6817,6819,6821],{"class":1052,"line":6800},269,[1050,6802,4126],{"class":2366},[1050,6804,6767],{"class":1097},[1050,6806,1085],{"class":1077},[1050,6808,4034],{"class":4033},[1050,6810,1085],{"class":1077},[1050,6812,6776],{"class":4033},[1050,6814,2578],{"class":2577},[1050,6816,1344],{"class":1160},[1050,6818,1376],{"class":1164},[1050,6820,1161],{"class":1160},[1050,6822,2308],{"class":1077},[1050,6824,6826,6829,6831,6833,6835,6838],{"class":1052,"line":6825},270,[1050,6827,6828],{"class":1097},"                    add_field_ops",[1050,6830,1085],{"class":1077},[1050,6832,2596],{"class":1144},[1050,6834,1078],{"class":1077},[1050,6836,6837],{"class":1144},"op",[1050,6839,2412],{"class":1077},[1050,6841,6843,6845],{"class":1052,"line":6842},271,[1050,6844,6551],{"class":2366},[1050,6846,2308],{"class":1077},[1050,6848,6850,6853,6855,6857,6859,6861],{"class":1052,"line":6849},272,[1050,6851,6852],{"class":1097},"                    other_ops",[1050,6854,1085],{"class":1077},[1050,6856,2596],{"class":1144},[1050,6858,1078],{"class":1077},[1050,6860,6837],{"class":1144},[1050,6862,2412],{"class":1077},[1050,6864,6866],{"class":1052,"line":6865},273,[1050,6867,2968],{"class":1097},[1050,6869,6871,6873,6875],{"class":1052,"line":6870},274,[1050,6872,6376],{"class":1097},[1050,6874,1101],{"class":1077},[1050,6876,1116],{"class":1077},[1050,6878,6880],{"class":1052,"line":6879},275,[1050,6881,2968],{"class":1097},[1050,6883,6885,6887,6890,6893,6896],{"class":1052,"line":6884},276,[1050,6886,2562],{"class":2366},[1050,6888,6889],{"class":1097}," create_model_op ",[1050,6891,6892],{"class":2577},"and",[1050,6894,6895],{"class":1097}," add_field_ops",[1050,6897,2308],{"class":1077},[1050,6899,6901],{"class":1052,"line":6900},277,[1050,6902,6903],{"class":1056},"                # Combine CreateModel with AddField operations\n",[1050,6905,6907,6910,6912,6915,6917,6920,6922,6925],{"class":1052,"line":6906},278,[1050,6908,6909],{"class":1097},"                combined_fields ",[1050,6911,1101],{"class":1077},[1050,6913,6914],{"class":3415}," list",[1050,6916,1078],{"class":1077},[1050,6918,6919],{"class":1144},"create_model_op",[1050,6921,1085],{"class":1077},[1050,6923,6924],{"class":1609},"fields",[1050,6926,2412],{"class":1077},[1050,6928,6930],{"class":1052,"line":6929},279,[1050,6931,4045],{"class":1097},[1050,6933,6935,6938,6941,6943,6945],{"class":1052,"line":6934},280,[1050,6936,6937],{"class":2366},"                for",[1050,6939,6940],{"class":1097}," add_field_op ",[1050,6942,2538],{"class":2366},[1050,6944,6895],{"class":1097},[1050,6946,2308],{"class":1077},[1050,6948,6950,6953,6955,6957,6960,6963,6965,6967,6969,6972,6974,6977],{"class":1052,"line":6949},281,[1050,6951,6952],{"class":1097},"                    combined_fields",[1050,6954,1085],{"class":1077},[1050,6956,2596],{"class":1144},[1050,6958,6959],{"class":1077},"((",[1050,6961,6962],{"class":1144},"add_field_op",[1050,6964,1085],{"class":1077},[1050,6966,3508],{"class":1609},[1050,6968,1195],{"class":1077},[1050,6970,6971],{"class":1144}," add_field_op",[1050,6973,1085],{"class":1077},[1050,6975,6976],{"class":1609},"field",[1050,6978,6979],{"class":1077},"))\n",[1050,6981,6983],{"class":1052,"line":6982},282,[1050,6984,4045],{"class":1097},[1050,6986,6988],{"class":1052,"line":6987},283,[1050,6989,6990],{"class":1056},"                # Create optimized CreateModel operation\n",[1050,6992,6994,6997,6999,7001,7003,7005],{"class":1052,"line":6993},284,[1050,6995,6996],{"class":1097},"                optimized_create ",[1050,6998,1101],{"class":1077},[1050,7000,3099],{"class":1097},[1050,7002,1085],{"class":1077},[1050,7004,1145],{"class":1144},[1050,7006,1148],{"class":1077},[1050,7008,7010,7012,7014,7016,7018,7020],{"class":1052,"line":7009},285,[1050,7011,5563],{"class":1154},[1050,7013,1101],{"class":1077},[1050,7015,6919],{"class":1144},[1050,7017,1085],{"class":1077},[1050,7019,3508],{"class":1609},[1050,7021,1170],{"class":1077},[1050,7023,7025,7028,7030,7033],{"class":1052,"line":7024},286,[1050,7026,7027],{"class":1154},"                    fields",[1050,7029,1101],{"class":1077},[1050,7031,7032],{"class":1144},"combined_fields",[1050,7034,1170],{"class":1077},[1050,7036,7038,7041,7043,7045,7047,7050],{"class":1052,"line":7037},287,[1050,7039,7040],{"class":1154},"                    options",[1050,7042,1101],{"class":1077},[1050,7044,6919],{"class":1144},[1050,7046,1085],{"class":1077},[1050,7048,7049],{"class":1609},"options",[1050,7051,1170],{"class":1077},[1050,7053,7055,7058,7060,7062,7064,7067],{"class":1052,"line":7054},288,[1050,7056,7057],{"class":1154},"                    bases",[1050,7059,1101],{"class":1077},[1050,7061,6919],{"class":1144},[1050,7063,1085],{"class":1077},[1050,7065,7066],{"class":1609},"bases",[1050,7068,1170],{"class":1077},[1050,7070,7072,7075,7077,7079,7081,7084],{"class":1052,"line":7071},289,[1050,7073,7074],{"class":1154},"                    managers",[1050,7076,1101],{"class":1077},[1050,7078,6919],{"class":1144},[1050,7080,1085],{"class":1077},[1050,7082,7083],{"class":1609},"managers",[1050,7085,1170],{"class":1077},[1050,7087,7089],{"class":1052,"line":7088},290,[1050,7090,5438],{"class":1077},[1050,7092,7094],{"class":1052,"line":7093},291,[1050,7095,4045],{"class":1097},[1050,7097,7099,7101,7103,7105,7107,7110],{"class":1052,"line":7098},292,[1050,7100,6633],{"class":1097},[1050,7102,1085],{"class":1077},[1050,7104,2596],{"class":1144},[1050,7106,1078],{"class":1077},[1050,7108,7109],{"class":1144},"optimized_create",[1050,7111,2412],{"class":1077},[1050,7113,7115],{"class":1052,"line":7114},293,[1050,7116,2968],{"class":1097},[1050,7118,7120,7122,7125],{"class":1052,"line":7119},294,[1050,7121,3495],{"class":2366},[1050,7123,7124],{"class":1097}," create_model_op",[1050,7126,2308],{"class":1077},[1050,7128,7130,7132,7134,7136,7138,7140],{"class":1052,"line":7129},295,[1050,7131,6633],{"class":1097},[1050,7133,1085],{"class":1077},[1050,7135,2596],{"class":1144},[1050,7137,1078],{"class":1077},[1050,7139,6919],{"class":1144},[1050,7141,2412],{"class":1077},[1050,7143,7145],{"class":1052,"line":7144},296,[1050,7146,2968],{"class":1097},[1050,7148,7150],{"class":1052,"line":7149},297,[1050,7151,7152],{"class":1056},"            # Add other operations\n",[1050,7154,7156,7159,7161,7163,7165,7168],{"class":1052,"line":7155},298,[1050,7157,7158],{"class":1097},"            optimized",[1050,7160,1085],{"class":1077},[1050,7162,6638],{"class":1144},[1050,7164,1078],{"class":1077},[1050,7166,7167],{"class":1144},"other_ops",[1050,7169,2412],{"class":1077},[1050,7171,7173],{"class":1052,"line":7172},299,[1050,7174,2968],{"class":1097},[1050,7176,7178,7180],{"class":1052,"line":7177},300,[1050,7179,3394],{"class":2366},[1050,7181,6658],{"class":1097},[1050,7183,7185],{"class":1052,"line":7184},301,[1050,7186,2445],{"class":1097},[1050,7188,7190,7192],{"class":1052,"line":7189},302,[1050,7191,3076],{"class":2366},[1050,7193,7194],{"class":1097}," optimize_operations\n",[1030,7196,7198],{"id":7197},"production-squashing-strategies","Production Squashing Strategies",[1035,7200,7202],{"id":7201},"safe-production-squashing","Safe Production Squashing",[1040,7204,7206],{"className":1042,"code":7205,"language":1044,"meta":1045,"style":1045},"class ProductionSquashingStrategy:\n    \"\"\"Strategies for safely squashing migrations in production\"\"\"\n    \n    @staticmethod\n    def create_production_squashing_plan():\n        \"\"\"Create plan for squashing migrations in production environment\"\"\"\n        \n        plan = {\n            'pre_squashing': [\n                \"1. Audit all environments to ensure migrations are synchronized\",\n                \"2. Create comprehensive backup of all databases\",\n                \"3. Document current migration state across all environments\",\n                \"4. Freeze new migration creation during squashing process\",\n                \"5. Notify all team members of squashing timeline\",\n                \"6. Prepare rollback procedures\"\n            ],\n            'squashing_process': [\n                \"1. Create squashed migration in development\",\n                \"2. Test squashed migration on copy of production data\",\n                \"3. Validate that squashed migration produces identical schema\",\n                \"4. Test rollback procedures with squashed migration\",\n                \"5. Deploy squashed migration to staging environment\",\n                \"6. Perform full application testing in staging\"\n            ],\n            'deployment': [\n                \"1. Schedule maintenance window for production deployment\",\n                \"2. Apply squashed migration to production\",\n                \"3. Verify schema integrity after deployment\",\n                \"4. Run application smoke tests\",\n                \"5. Monitor application performance and error rates\",\n                \"6. Clean up old migration files after successful deployment\"\n            ],\n            'post_deployment': [\n                \"1. Update deployment documentation\",\n                \"2. Notify team of successful squashing\",\n                \"3. Resume normal migration development process\",\n                \"4. Archive old migration backups after retention period\",\n                \"5. Update CI/CD pipelines if needed\"\n            ]\n        }\n        \n        return plan\n    \n    @staticmethod\n    def create_zero_downtime_squashing():\n        \"\"\"Create strategy for zero-downtime migration squashing\"\"\"\n        \n        def zero_downtime_squash():\n            \"\"\"Implement zero-downtime squashing strategy\"\"\"\n            \n            # Phase 1: Deploy squashed migration alongside old migrations\n            phase1_migration = '''\nclass Migration(migrations.Migration):\n    \"\"\"\n    Phase 1: Squashed migration that coexists with old migrations\n    This migration is marked as applied but doesn't actually run\n    \"\"\"\n    \n    dependencies = [\n        ('blog', '0010_latest_individual_migration'),\n    ]\n    \n    # Mark as already applied since schema already exists\n    operations = []\n    \n    # This migration replaces the old ones but doesn't change schema\n    replaces = [\n        ('blog', '0001_initial'),\n        ('blog', '0002_add_author'),\n        # ... other migrations\n        ('blog', '0010_latest_individual_migration'),\n    ]\n'''\n            \n            # Phase 2: Remove old migration files after squashed migration is applied\n            phase2_steps = [\n                \"1. Verify squashed migration is applied in all environments\",\n                \"2. Remove old migration files from codebase\",\n                \"3. Deploy code without old migration files\",\n                \"4. Verify application continues to work normally\"\n            ]\n            \n            return phase1_migration, phase2_steps\n        \n        return zero_downtime_squash\n    \n    @staticmethod\n    def handle_squashing_conflicts():\n        \"\"\"Handle conflicts that arise during squashing\"\"\"\n        \n        conflict_resolution = {\n            'dependency_conflicts': {\n                'description': 'External apps depend on migrations being squashed',\n                'solution': [\n                    \"1. Identify all external dependencies\",\n                    \"2. Update external app migrations to depend on squashed migration\",\n                    \"3. Coordinate deployment across all affected apps\",\n                    \"4. Test integration between apps after squashing\"\n                ]\n            },\n            'data_migration_conflicts': {\n                'description': 'Data migrations have complex interdependencies',\n                'solution': [\n                    \"1. Analyze data migration dependencies carefully\",\n                    \"2. Combine data migrations in correct order\",\n                    \"3. Test combined data migration on production-like data\",\n                    \"4. Consider keeping complex data migrations separate\"\n                ]\n            },\n            'schema_conflicts': {\n                'description': 'Schema changes conflict when combined',\n                'solution': [\n                    \"1. Identify conflicting schema operations\",\n                    \"2. Resolve conflicts by choosing final desired state\",\n                    \"3. Test that final schema matches expectations\",\n                    \"4. Verify all constraints and indexes are correct\"\n                ]\n            },\n            'rollback_conflicts': {\n                'description': 'Squashed migration cannot be safely rolled back',\n                'solution': [\n                    \"1. Document that squashed migration is not reversible\",\n                    \"2. Create separate rollback procedures if needed\",\n                    \"3. Ensure backup and restore procedures are available\",\n                    \"4. Test rollback procedures in staging environment\"\n                ]\n            }\n        }\n        \n        return conflict_resolution\n\n# Automated squashing tools\nclass AutomatedSquashingTools:\n    \"\"\"Tools for automating migration squashing\"\"\"\n    \n    @staticmethod\n    def create_squashing_script():\n        \"\"\"Create script to automate squashing process\"\"\"\n        \n        script_content = '''#!/bin/bash\n# Automated migration squashing script\n\nset -e\n\nAPP_NAME=$1\nSTART_MIGRATION=$2\nEND_MIGRATION=$3\n\nif [ -z \"$APP_NAME\" ] || [ -z \"$START_MIGRATION\" ] || [ -z \"$END_MIGRATION\" ]; then\n    echo \"Usage: $0 \u003Capp_name> \u003Cstart_migration> \u003Cend_migration>\"\n    exit 1\nfi\n\necho \"Starting migration squashing for $APP_NAME: $START_MIGRATION to $END_MIGRATION\"\n\n# Backup existing migrations\necho \"Creating backup of existing migrations...\"\ncp -r $APP_NAME/migrations $APP_NAME/migrations_backup_$(date +%Y%m%d_%H%M%S)\n\n# Check current migration state\necho \"Checking current migration state...\"\npython manage.py showmigrations $APP_NAME\n\n# Create squashed migration\necho \"Creating squashed migration...\"\npython manage.py squashmigrations $APP_NAME $START_MIGRATION $END_MIGRATION\n\n# Test squashed migration\necho \"Testing squashed migration on test database...\"\npython manage.py migrate --database=test\n\n# Validate schema\necho \"Validating schema...\"\npython manage.py sqlmigrate $APP_NAME $(ls $APP_NAME/migrations/*squashed*.py | head -1 | sed 's/.*\\\\///;s/\\\\.py//')\n\necho \"Squashing completed successfully!\"\necho \"Please review the squashed migration before deploying to production.\"\n'''\n        \n        return script_content\n    \n    @staticmethod\n    def create_squashing_validator():\n        \"\"\"Create validator for squashed migrations\"\"\"\n        \n        def validate_squashed_migration(app_label, squashed_migration_name):\n            \"\"\"Validate that squashed migration is correct\"\"\"\n            \n            from django.db.migrations.loader import MigrationLoader\n            from django.db.migrations.state import ProjectState\n            \n            loader = MigrationLoader(connection)\n            \n            validation_results = {\n                'valid': True,\n                'errors': [],\n                'warnings': []\n            }\n            \n            try:\n                # Get squashed migration\n                squashed_migration = loader.get_migration(app_label, squashed_migration_name)\n                \n                # Check replaces attribute\n                if not hasattr(squashed_migration, 'replaces') or not squashed_migration.replaces:\n                    validation_results['errors'].append(\n                        \"Squashed migration missing 'replaces' attribute\"\n                    )\n                \n                # Validate that replaced migrations exist\n                for replaced_app, replaced_name in squashed_migration.replaces:\n                    if (replaced_app, replaced_name) not in loader.graph.nodes:\n                        validation_results['warnings'].append(\n                            f\"Replaced migration {replaced_app}.{replaced_name} not found\"\n                        )\n                \n                # Check dependencies\n                for dep_app, dep_name in squashed_migration.dependencies:\n                    if (dep_app, dep_name) not in loader.graph.nodes:\n                        validation_results['errors'].append(\n                            f\"Dependency {dep_app}.{dep_name} not found\"\n                        )\n                \n                # Validate operations\n                for operation in squashed_migration.operations:\n                    if hasattr(operation, 'reversible') and not operation.reversible:\n                        validation_results['warnings'].append(\n                            f\"Operation {operation.__class__.__name__} is not reversible\"\n                        )\n            \n            except Exception as e:\n                validation_results['valid'] = False\n                validation_results['errors'].append(f\"Error loading squashed migration: {e}\")\n            \n            return validation_results\n        \n        return validate_squashed_migration\n",[1047,7207,7208,7217,7226,7230,7236,7245,7254,7258,7267,7280,7292,7303,7314,7325,7336,7345,7349,7362,7373,7384,7395,7406,7417,7426,7430,7443,7454,7465,7476,7487,7498,7507,7511,7524,7535,7546,7557,7568,7577,7581,7585,7589,7596,7600,7606,7615,7624,7628,7637,7646,7650,7655,7664,7668,7672,7677,7682,7686,7690,7694,7699,7703,7707,7712,7717,7721,7726,7730,7734,7738,7743,7747,7751,7755,7759,7764,7773,7784,7795,7806,7815,7819,7823,7835,7839,7846,7850,7856,7865,7874,7878,7887,7900,7919,7932,7944,7955,7966,7975,7980,7984,7997,8016,8028,8039,8050,8061,8070,8074,8078,8091,8110,8122,8133,8144,8155,8164,8168,8172,8185,8204,8216,8227,8238,8249,8258,8262,8267,8271,8275,8282,8286,8291,8300,8309,8313,8319,8328,8337,8341,8354,8359,8363,8368,8372,8377,8382,8387,8391,8396,8401,8406,8411,8415,8420,8424,8429,8434,8445,8449,8454,8459,8464,8468,8473,8478,8483,8487,8492,8497,8502,8506,8511,8516,8532,8536,8541,8546,8550,8554,8561,8565,8571,8580,8589,8593,8610,8619,8623,8646,8670,8674,8689,8693,8702,8717,8730,8742,8746,8750,8757,8762,8786,8790,8795,8832,8851,8861,8865,8869,8874,8896,8929,8948,8974,8979,8983,8988,9009,9040,9058,9082,9086,9090,9095,9111,9145,9163,9187,9191,9195,9211,9230,9265,9269,9276,9280],{"__ignoreMap":1045},[1050,7209,7210,7212,7215],{"class":1052,"line":1053},[1050,7211,1070],{"class":1069},[1050,7213,7214],{"class":1073}," ProductionSquashingStrategy",[1050,7216,2308],{"class":1077},[1050,7218,7219,7221,7224],{"class":1052,"line":1060},[1050,7220,1844],{"class":1843},[1050,7222,7223],{"class":1847},"Strategies for safely squashing migrations in production",[1050,7225,1851],{"class":1843},[1050,7227,7228],{"class":1052,"line":1066},[1050,7229,1122],{"class":1097},[1050,7231,7232,7234],{"class":1052,"line":1094},[1050,7233,4477],{"class":1077},[1050,7235,4480],{"class":3415},[1050,7237,7238,7240,7243],{"class":1052,"line":1108},[1050,7239,2326],{"class":1069},[1050,7241,7242],{"class":2423}," create_production_squashing_plan",[1050,7244,4490],{"class":1077},[1050,7246,7247,7249,7252],{"class":1052,"line":1119},[1050,7248,2435],{"class":1843},[1050,7250,7251],{"class":1847},"Create plan for squashing migrations in production environment",[1050,7253,1851],{"class":1843},[1050,7255,7256],{"class":1052,"line":1125},[1050,7257,2445],{"class":1097},[1050,7259,7260,7263,7265],{"class":1052,"line":1136},[1050,7261,7262],{"class":1097},"        plan ",[1050,7264,1101],{"class":1077},[1050,7266,2455],{"class":1077},[1050,7268,7269,7271,7274,7276,7278],{"class":1052,"line":1151},[1050,7270,2460],{"class":1160},[1050,7272,7273],{"class":1164},"pre_squashing",[1050,7275,1161],{"class":1160},[1050,7277,2468],{"class":1077},[1050,7279,1133],{"class":1077},[1050,7281,7282,7285,7288,7290],{"class":1052,"line":1173},[1050,7283,7284],{"class":1160},"                \"",[1050,7286,7287],{"class":1164},"1. Audit all environments to ensure migrations are synchronized",[1050,7289,3891],{"class":1160},[1050,7291,1170],{"class":1077},[1050,7293,7294,7296,7299,7301],{"class":1052,"line":1182},[1050,7295,7284],{"class":1160},[1050,7297,7298],{"class":1164},"2. Create comprehensive backup of all databases",[1050,7300,3891],{"class":1160},[1050,7302,1170],{"class":1077},[1050,7304,7305,7307,7310,7312],{"class":1052,"line":1219},[1050,7306,7284],{"class":1160},[1050,7308,7309],{"class":1164},"3. Document current migration state across all environments",[1050,7311,3891],{"class":1160},[1050,7313,1170],{"class":1077},[1050,7315,7316,7318,7321,7323],{"class":1052,"line":1253},[1050,7317,7284],{"class":1160},[1050,7319,7320],{"class":1164},"4. Freeze new migration creation during squashing process",[1050,7322,3891],{"class":1160},[1050,7324,1170],{"class":1077},[1050,7326,7327,7329,7332,7334],{"class":1052,"line":1277},[1050,7328,7284],{"class":1160},[1050,7330,7331],{"class":1164},"5. Notify all team members of squashing timeline",[1050,7333,3891],{"class":1160},[1050,7335,1170],{"class":1077},[1050,7337,7338,7340,7343],{"class":1052,"line":1283},[1050,7339,7284],{"class":1160},[1050,7341,7342],{"class":1164},"6. Prepare rollback procedures",[1050,7344,4259],{"class":1160},[1050,7346,7347],{"class":1052,"line":1289},[1050,7348,1280],{"class":1077},[1050,7350,7351,7353,7356,7358,7360],{"class":1052,"line":1295},[1050,7352,2460],{"class":1160},[1050,7354,7355],{"class":1164},"squashing_process",[1050,7357,1161],{"class":1160},[1050,7359,2468],{"class":1077},[1050,7361,1133],{"class":1077},[1050,7363,7364,7366,7369,7371],{"class":1052,"line":1302},[1050,7365,7284],{"class":1160},[1050,7367,7368],{"class":1164},"1. Create squashed migration in development",[1050,7370,3891],{"class":1160},[1050,7372,1170],{"class":1077},[1050,7374,7375,7377,7380,7382],{"class":1052,"line":1308},[1050,7376,7284],{"class":1160},[1050,7378,7379],{"class":1164},"2. Test squashed migration on copy of production data",[1050,7381,3891],{"class":1160},[1050,7383,1170],{"class":1077},[1050,7385,7386,7388,7391,7393],{"class":1052,"line":1325},[1050,7387,7284],{"class":1160},[1050,7389,7390],{"class":1164},"3. Validate that squashed migration produces identical schema",[1050,7392,3891],{"class":1160},[1050,7394,1170],{"class":1077},[1050,7396,7397,7399,7402,7404],{"class":1052,"line":1355},[1050,7398,7284],{"class":1160},[1050,7400,7401],{"class":1164},"4. Test rollback procedures with squashed migration",[1050,7403,3891],{"class":1160},[1050,7405,1170],{"class":1077},[1050,7407,7408,7410,7413,7415],{"class":1052,"line":1360},[1050,7409,7284],{"class":1160},[1050,7411,7412],{"class":1164},"5. Deploy squashed migration to staging environment",[1050,7414,3891],{"class":1160},[1050,7416,1170],{"class":1077},[1050,7418,7419,7421,7424],{"class":1052,"line":1369},[1050,7420,7284],{"class":1160},[1050,7422,7423],{"class":1164},"6. Perform full application testing in staging",[1050,7425,4259],{"class":1160},[1050,7427,7428],{"class":1052,"line":1381},[1050,7429,1280],{"class":1077},[1050,7431,7432,7434,7437,7439,7441],{"class":1052,"line":1398},[1050,7433,2460],{"class":1160},[1050,7435,7436],{"class":1164},"deployment",[1050,7438,1161],{"class":1160},[1050,7440,2468],{"class":1077},[1050,7442,1133],{"class":1077},[1050,7444,7445,7447,7450,7452],{"class":1052,"line":1414},[1050,7446,7284],{"class":1160},[1050,7448,7449],{"class":1164},"1. Schedule maintenance window for production deployment",[1050,7451,3891],{"class":1160},[1050,7453,1170],{"class":1077},[1050,7455,7456,7458,7461,7463],{"class":1052,"line":1455},[1050,7457,7284],{"class":1160},[1050,7459,7460],{"class":1164},"2. Apply squashed migration to production",[1050,7462,3891],{"class":1160},[1050,7464,1170],{"class":1077},[1050,7466,7467,7469,7472,7474],{"class":1052,"line":1460},[1050,7468,7284],{"class":1160},[1050,7470,7471],{"class":1164},"3. Verify schema integrity after deployment",[1050,7473,3891],{"class":1160},[1050,7475,1170],{"class":1077},[1050,7477,7478,7480,7483,7485],{"class":1052,"line":1465},[1050,7479,7284],{"class":1160},[1050,7481,7482],{"class":1164},"4. Run application smoke tests",[1050,7484,3891],{"class":1160},[1050,7486,1170],{"class":1077},[1050,7488,7489,7491,7494,7496],{"class":1052,"line":1470},[1050,7490,7284],{"class":1160},[1050,7492,7493],{"class":1164},"5. Monitor application performance and error rates",[1050,7495,3891],{"class":1160},[1050,7497,1170],{"class":1077},[1050,7499,7500,7502,7505],{"class":1052,"line":1476},[1050,7501,7284],{"class":1160},[1050,7503,7504],{"class":1164},"6. Clean up old migration files after successful deployment",[1050,7506,4259],{"class":1160},[1050,7508,7509],{"class":1052,"line":1493},[1050,7510,1280],{"class":1077},[1050,7512,7513,7515,7518,7520,7522],{"class":1052,"line":1519},[1050,7514,2460],{"class":1160},[1050,7516,7517],{"class":1164},"post_deployment",[1050,7519,1161],{"class":1160},[1050,7521,2468],{"class":1077},[1050,7523,1133],{"class":1077},[1050,7525,7526,7528,7531,7533],{"class":1052,"line":1524},[1050,7527,7284],{"class":1160},[1050,7529,7530],{"class":1164},"1. Update deployment documentation",[1050,7532,3891],{"class":1160},[1050,7534,1170],{"class":1077},[1050,7536,7537,7539,7542,7544],{"class":1052,"line":1533},[1050,7538,7284],{"class":1160},[1050,7540,7541],{"class":1164},"2. Notify team of successful squashing",[1050,7543,3891],{"class":1160},[1050,7545,1170],{"class":1077},[1050,7547,7548,7550,7553,7555],{"class":1052,"line":1544},[1050,7549,7284],{"class":1160},[1050,7551,7552],{"class":1164},"3. Resume normal migration development process",[1050,7554,3891],{"class":1160},[1050,7556,1170],{"class":1077},[1050,7558,7559,7561,7564,7566],{"class":1052,"line":1559},[1050,7560,7284],{"class":1160},[1050,7562,7563],{"class":1164},"4. Archive old migration backups after retention period",[1050,7565,3891],{"class":1160},[1050,7567,1170],{"class":1077},[1050,7569,7570,7572,7575],{"class":1052,"line":1575},[1050,7571,7284],{"class":1160},[1050,7573,7574],{"class":1164},"5. Update CI/CD pipelines if needed",[1050,7576,4259],{"class":1160},[1050,7578,7579],{"class":1052,"line":1615},[1050,7580,5935],{"class":1077},[1050,7582,7583],{"class":1052,"line":1628},[1050,7584,2505],{"class":1077},[1050,7586,7587],{"class":1052,"line":1633},[1050,7588,2445],{"class":1097},[1050,7590,7591,7593],{"class":1052,"line":1638},[1050,7592,3076],{"class":2366},[1050,7594,7595],{"class":1097}," plan\n",[1050,7597,7598],{"class":1052,"line":1643},[1050,7599,1122],{"class":1097},[1050,7601,7602,7604],{"class":1052,"line":1649},[1050,7603,4477],{"class":1077},[1050,7605,4480],{"class":3415},[1050,7607,7608,7610,7613],{"class":1052,"line":1666},[1050,7609,2326],{"class":1069},[1050,7611,7612],{"class":2423}," create_zero_downtime_squashing",[1050,7614,4490],{"class":1077},[1050,7616,7617,7619,7622],{"class":1052,"line":1692},[1050,7618,2435],{"class":1843},[1050,7620,7621],{"class":1847},"Create strategy for zero-downtime migration squashing",[1050,7623,1851],{"class":1843},[1050,7625,7626],{"class":1052,"line":1697},[1050,7627,2445],{"class":1097},[1050,7629,7630,7632,7635],{"class":1052,"line":1706},[1050,7631,5280],{"class":1069},[1050,7633,7634],{"class":2423}," zero_downtime_squash",[1050,7636,4490],{"class":1077},[1050,7638,7639,7641,7644],{"class":1052,"line":1717},[1050,7640,5290],{"class":1843},[1050,7642,7643],{"class":1847},"Implement zero-downtime squashing strategy",[1050,7645,1851],{"class":1843},[1050,7647,7648],{"class":1052,"line":1732},[1050,7649,2968],{"class":1097},[1050,7651,7652],{"class":1052,"line":1748},[1050,7653,7654],{"class":1056},"            # Phase 1: Deploy squashed migration alongside old migrations\n",[1050,7656,7657,7660,7662],{"class":1052,"line":1785},[1050,7658,7659],{"class":1097},"            phase1_migration ",[1050,7661,1101],{"class":1077},[1050,7663,4640],{"class":1160},[1050,7665,7666],{"class":1052,"line":1790},[1050,7667,4659],{"class":1164},[1050,7669,7670],{"class":1052,"line":1795},[1050,7671,4664],{"class":1164},[1050,7673,7674],{"class":1052,"line":1800},[1050,7675,7676],{"class":1164},"    Phase 1: Squashed migration that coexists with old migrations\n",[1050,7678,7679],{"class":1052,"line":1806},[1050,7680,7681],{"class":1164},"    This migration is marked as applied but doesn't actually run\n",[1050,7683,7684],{"class":1052,"line":1812},[1050,7685,4664],{"class":1164},[1050,7687,7688],{"class":1052,"line":1818},[1050,7689,1122],{"class":1164},[1050,7691,7692],{"class":1052,"line":1823},[1050,7693,4734],{"class":1164},[1050,7695,7696],{"class":1052,"line":1840},[1050,7697,7698],{"class":1164},"        ('blog', '0010_latest_individual_migration'),\n",[1050,7700,7701],{"class":1052,"line":1854},[1050,7702,1292],{"class":1164},[1050,7704,7705],{"class":1052,"line":1859},[1050,7706,1122],{"class":1164},[1050,7708,7709],{"class":1052,"line":1868},[1050,7710,7711],{"class":1164},"    # Mark as already applied since schema already exists\n",[1050,7713,7714],{"class":1052,"line":1873},[1050,7715,7716],{"class":1164},"    operations = []\n",[1050,7718,7719],{"class":1052,"line":1882},[1050,7720,1122],{"class":1164},[1050,7722,7723],{"class":1052,"line":1887},[1050,7724,7725],{"class":1164},"    # This migration replaces the old ones but doesn't change schema\n",[1050,7727,7728],{"class":1052,"line":1893},[1050,7729,4752],{"class":1164},[1050,7731,7732],{"class":1052,"line":1903},[1050,7733,4757],{"class":1164},[1050,7735,7736],{"class":1052,"line":1925},[1050,7737,4762],{"class":1164},[1050,7739,7740],{"class":1052,"line":1946},[1050,7741,7742],{"class":1164},"        # ... other migrations\n",[1050,7744,7745],{"class":1052,"line":1967},[1050,7746,7698],{"class":1164},[1050,7748,7749],{"class":1052,"line":1989},[1050,7750,1292],{"class":1164},[1050,7752,7753],{"class":1052,"line":1994},[1050,7754,4954],{"class":1160},[1050,7756,7757],{"class":1052,"line":1999},[1050,7758,2968],{"class":1097},[1050,7760,7761],{"class":1052,"line":2008},[1050,7762,7763],{"class":1056},"            # Phase 2: Remove old migration files after squashed migration is applied\n",[1050,7765,7766,7769,7771],{"class":1052,"line":2014},[1050,7767,7768],{"class":1097},"            phase2_steps ",[1050,7770,1101],{"class":1077},[1050,7772,1133],{"class":1077},[1050,7774,7775,7777,7780,7782],{"class":1052,"line":2025},[1050,7776,7284],{"class":1160},[1050,7778,7779],{"class":1164},"1. Verify squashed migration is applied in all environments",[1050,7781,3891],{"class":1160},[1050,7783,1170],{"class":1077},[1050,7785,7786,7788,7791,7793],{"class":1052,"line":2040},[1050,7787,7284],{"class":1160},[1050,7789,7790],{"class":1164},"2. Remove old migration files from codebase",[1050,7792,3891],{"class":1160},[1050,7794,1170],{"class":1077},[1050,7796,7797,7799,7802,7804],{"class":1052,"line":2047},[1050,7798,7284],{"class":1160},[1050,7800,7801],{"class":1164},"3. Deploy code without old migration files",[1050,7803,3891],{"class":1160},[1050,7805,1170],{"class":1077},[1050,7807,7808,7810,7813],{"class":1052,"line":2076},[1050,7809,7284],{"class":1160},[1050,7811,7812],{"class":1164},"4. Verify application continues to work normally",[1050,7814,4259],{"class":1160},[1050,7816,7817],{"class":1052,"line":2105},[1050,7818,5935],{"class":1077},[1050,7820,7821],{"class":1052,"line":2126},[1050,7822,2968],{"class":1097},[1050,7824,7825,7827,7830,7832],{"class":1052,"line":2167},[1050,7826,3394],{"class":2366},[1050,7828,7829],{"class":1097}," phase1_migration",[1050,7831,1195],{"class":1077},[1050,7833,7834],{"class":1097}," phase2_steps\n",[1050,7836,7837],{"class":1052,"line":2196},[1050,7838,2445],{"class":1097},[1050,7840,7841,7843],{"class":1052,"line":2237},[1050,7842,3076],{"class":2366},[1050,7844,7845],{"class":1097}," zero_downtime_squash\n",[1050,7847,7848],{"class":1052,"line":2242},[1050,7849,1122],{"class":1097},[1050,7851,7852,7854],{"class":1052,"line":2247},[1050,7853,4477],{"class":1077},[1050,7855,4480],{"class":3415},[1050,7857,7858,7860,7863],{"class":1052,"line":2252},[1050,7859,2326],{"class":1069},[1050,7861,7862],{"class":2423}," handle_squashing_conflicts",[1050,7864,4490],{"class":1077},[1050,7866,7867,7869,7872],{"class":1052,"line":2257},[1050,7868,2435],{"class":1843},[1050,7870,7871],{"class":1847},"Handle conflicts that arise during squashing",[1050,7873,1851],{"class":1843},[1050,7875,7876],{"class":1052,"line":2263},[1050,7877,2445],{"class":1097},[1050,7879,7880,7883,7885],{"class":1052,"line":2269},[1050,7881,7882],{"class":1097},"        conflict_resolution ",[1050,7884,1101],{"class":1077},[1050,7886,2455],{"class":1077},[1050,7888,7889,7891,7894,7896,7898],{"class":1052,"line":2274},[1050,7890,2460],{"class":1160},[1050,7892,7893],{"class":1164},"dependency_conflicts",[1050,7895,1161],{"class":1160},[1050,7897,2468],{"class":1077},[1050,7899,2455],{"class":1077},[1050,7901,7902,7904,7906,7908,7910,7912,7915,7917],{"class":1052,"line":2280},[1050,7903,2991],{"class":1160},[1050,7905,5587],{"class":1164},[1050,7907,1161],{"class":1160},[1050,7909,2468],{"class":1077},[1050,7911,1344],{"class":1160},[1050,7913,7914],{"class":1164},"External apps depend on migrations being squashed",[1050,7916,1161],{"class":1160},[1050,7918,1170],{"class":1077},[1050,7920,7921,7923,7926,7928,7930],{"class":1052,"line":2286},[1050,7922,2991],{"class":1160},[1050,7924,7925],{"class":1164},"solution",[1050,7927,1161],{"class":1160},[1050,7929,2468],{"class":1077},[1050,7931,1133],{"class":1077},[1050,7933,7934,7937,7940,7942],{"class":1052,"line":3492},[1050,7935,7936],{"class":1160},"                    \"",[1050,7938,7939],{"class":1164},"1. Identify all external dependencies",[1050,7941,3891],{"class":1160},[1050,7943,1170],{"class":1077},[1050,7945,7946,7948,7951,7953],{"class":1052,"line":3515},[1050,7947,7936],{"class":1160},[1050,7949,7950],{"class":1164},"2. Update external app migrations to depend on squashed migration",[1050,7952,3891],{"class":1160},[1050,7954,1170],{"class":1077},[1050,7956,7957,7959,7962,7964],{"class":1052,"line":3538},[1050,7958,7936],{"class":1160},[1050,7960,7961],{"class":1164},"3. Coordinate deployment across all affected apps",[1050,7963,3891],{"class":1160},[1050,7965,1170],{"class":1077},[1050,7967,7968,7970,7973],{"class":1052,"line":3543},[1050,7969,7936],{"class":1160},[1050,7971,7972],{"class":1164},"4. Test integration between apps after squashing",[1050,7974,4259],{"class":1160},[1050,7976,7977],{"class":1052,"line":3549},[1050,7978,7979],{"class":1077},"                ]\n",[1050,7981,7982],{"class":1052,"line":3555},[1050,7983,4941],{"class":1077},[1050,7985,7986,7988,7991,7993,7995],{"class":1052,"line":3574},[1050,7987,2460],{"class":1160},[1050,7989,7990],{"class":1164},"data_migration_conflicts",[1050,7992,1161],{"class":1160},[1050,7994,2468],{"class":1077},[1050,7996,2455],{"class":1077},[1050,7998,7999,8001,8003,8005,8007,8009,8012,8014],{"class":1052,"line":3579},[1050,8000,2991],{"class":1160},[1050,8002,5587],{"class":1164},[1050,8004,1161],{"class":1160},[1050,8006,2468],{"class":1077},[1050,8008,1344],{"class":1160},[1050,8010,8011],{"class":1164},"Data migrations have complex interdependencies",[1050,8013,1161],{"class":1160},[1050,8015,1170],{"class":1077},[1050,8017,8018,8020,8022,8024,8026],{"class":1052,"line":3603},[1050,8019,2991],{"class":1160},[1050,8021,7925],{"class":1164},[1050,8023,1161],{"class":1160},[1050,8025,2468],{"class":1077},[1050,8027,1133],{"class":1077},[1050,8029,8030,8032,8035,8037],{"class":1052,"line":3613},[1050,8031,7936],{"class":1160},[1050,8033,8034],{"class":1164},"1. Analyze data migration dependencies carefully",[1050,8036,3891],{"class":1160},[1050,8038,1170],{"class":1077},[1050,8040,8041,8043,8046,8048],{"class":1052,"line":3618},[1050,8042,7936],{"class":1160},[1050,8044,8045],{"class":1164},"2. Combine data migrations in correct order",[1050,8047,3891],{"class":1160},[1050,8049,1170],{"class":1077},[1050,8051,8052,8054,8057,8059],{"class":1052,"line":3628},[1050,8053,7936],{"class":1160},[1050,8055,8056],{"class":1164},"3. Test combined data migration on production-like data",[1050,8058,3891],{"class":1160},[1050,8060,1170],{"class":1077},[1050,8062,8063,8065,8068],{"class":1052,"line":3645},[1050,8064,7936],{"class":1160},[1050,8066,8067],{"class":1164},"4. Consider keeping complex data migrations separate",[1050,8069,4259],{"class":1160},[1050,8071,8072],{"class":1052,"line":3659},[1050,8073,7979],{"class":1077},[1050,8075,8076],{"class":1052,"line":3673},[1050,8077,4941],{"class":1077},[1050,8079,8080,8082,8085,8087,8089],{"class":1052,"line":3678},[1050,8081,2460],{"class":1160},[1050,8083,8084],{"class":1164},"schema_conflicts",[1050,8086,1161],{"class":1160},[1050,8088,2468],{"class":1077},[1050,8090,2455],{"class":1077},[1050,8092,8093,8095,8097,8099,8101,8103,8106,8108],{"class":1052,"line":3683},[1050,8094,2991],{"class":1160},[1050,8096,5587],{"class":1164},[1050,8098,1161],{"class":1160},[1050,8100,2468],{"class":1077},[1050,8102,1344],{"class":1160},[1050,8104,8105],{"class":1164},"Schema changes conflict when combined",[1050,8107,1161],{"class":1160},[1050,8109,1170],{"class":1077},[1050,8111,8112,8114,8116,8118,8120],{"class":1052,"line":3689},[1050,8113,2991],{"class":1160},[1050,8115,7925],{"class":1164},[1050,8117,1161],{"class":1160},[1050,8119,2468],{"class":1077},[1050,8121,1133],{"class":1077},[1050,8123,8124,8126,8129,8131],{"class":1052,"line":3698},[1050,8125,7936],{"class":1160},[1050,8127,8128],{"class":1164},"1. Identify conflicting schema operations",[1050,8130,3891],{"class":1160},[1050,8132,1170],{"class":1077},[1050,8134,8135,8137,8140,8142],{"class":1052,"line":3703},[1050,8136,7936],{"class":1160},[1050,8138,8139],{"class":1164},"2. Resolve conflicts by choosing final desired state",[1050,8141,3891],{"class":1160},[1050,8143,1170],{"class":1077},[1050,8145,8146,8148,8151,8153],{"class":1052,"line":3728},[1050,8147,7936],{"class":1160},[1050,8149,8150],{"class":1164},"3. Test that final schema matches expectations",[1050,8152,3891],{"class":1160},[1050,8154,1170],{"class":1077},[1050,8156,8157,8159,8162],{"class":1052,"line":3751},[1050,8158,7936],{"class":1160},[1050,8160,8161],{"class":1164},"4. Verify all constraints and indexes are correct",[1050,8163,4259],{"class":1160},[1050,8165,8166],{"class":1052,"line":3770},[1050,8167,7979],{"class":1077},[1050,8169,8170],{"class":1052,"line":3775},[1050,8171,4941],{"class":1077},[1050,8173,8174,8176,8179,8181,8183],{"class":1052,"line":3786},[1050,8175,2460],{"class":1160},[1050,8177,8178],{"class":1164},"rollback_conflicts",[1050,8180,1161],{"class":1160},[1050,8182,2468],{"class":1077},[1050,8184,2455],{"class":1077},[1050,8186,8187,8189,8191,8193,8195,8197,8200,8202],{"class":1052,"line":3791},[1050,8188,2991],{"class":1160},[1050,8190,5587],{"class":1164},[1050,8192,1161],{"class":1160},[1050,8194,2468],{"class":1077},[1050,8196,1344],{"class":1160},[1050,8198,8199],{"class":1164},"Squashed migration cannot be safely rolled back",[1050,8201,1161],{"class":1160},[1050,8203,1170],{"class":1077},[1050,8205,8206,8208,8210,8212,8214],{"class":1052,"line":3799},[1050,8207,2991],{"class":1160},[1050,8209,7925],{"class":1164},[1050,8211,1161],{"class":1160},[1050,8213,2468],{"class":1077},[1050,8215,1133],{"class":1077},[1050,8217,8218,8220,8223,8225],{"class":1052,"line":3820},[1050,8219,7936],{"class":1160},[1050,8221,8222],{"class":1164},"1. Document that squashed migration is not reversible",[1050,8224,3891],{"class":1160},[1050,8226,1170],{"class":1077},[1050,8228,8229,8231,8234,8236],{"class":1052,"line":3840},[1050,8230,7936],{"class":1160},[1050,8232,8233],{"class":1164},"2. Create separate rollback procedures if needed",[1050,8235,3891],{"class":1160},[1050,8237,1170],{"class":1077},[1050,8239,8240,8242,8245,8247],{"class":1052,"line":3851},[1050,8241,7936],{"class":1160},[1050,8243,8244],{"class":1164},"3. Ensure backup and restore procedures are available",[1050,8246,3891],{"class":1160},[1050,8248,1170],{"class":1077},[1050,8250,8251,8253,8256],{"class":1052,"line":3872},[1050,8252,7936],{"class":1160},[1050,8254,8255],{"class":1164},"4. Test rollback procedures in staging environment",[1050,8257,4259],{"class":1160},[1050,8259,8260],{"class":1052,"line":3901},[1050,8261,7979],{"class":1077},[1050,8263,8264],{"class":1052,"line":3909},[1050,8265,8266],{"class":1077},"            }\n",[1050,8268,8269],{"class":1052,"line":3914},[1050,8270,2505],{"class":1077},[1050,8272,8273],{"class":1052,"line":3941},[1050,8274,2445],{"class":1097},[1050,8276,8277,8279],{"class":1052,"line":3946},[1050,8278,3076],{"class":2366},[1050,8280,8281],{"class":1097}," conflict_resolution\n",[1050,8283,8284],{"class":1052,"line":3952},[1050,8285,1299],{"emptyLinePlaceholder":1298},[1050,8287,8288],{"class":1052,"line":3966},[1050,8289,8290],{"class":1056},"# Automated squashing tools\n",[1050,8292,8293,8295,8298],{"class":1052,"line":3997},[1050,8294,1070],{"class":1069},[1050,8296,8297],{"class":1073}," AutomatedSquashingTools",[1050,8299,2308],{"class":1077},[1050,8301,8302,8304,8307],{"class":1052,"line":4002},[1050,8303,1844],{"class":1843},[1050,8305,8306],{"class":1847},"Tools for automating migration squashing",[1050,8308,1851],{"class":1843},[1050,8310,8311],{"class":1052,"line":4020},[1050,8312,1122],{"class":1097},[1050,8314,8315,8317],{"class":1052,"line":4042},[1050,8316,4477],{"class":1077},[1050,8318,4480],{"class":3415},[1050,8320,8321,8323,8326],{"class":1052,"line":4048},[1050,8322,2326],{"class":1069},[1050,8324,8325],{"class":2423}," create_squashing_script",[1050,8327,4490],{"class":1077},[1050,8329,8330,8332,8335],{"class":1052,"line":4054},[1050,8331,2435],{"class":1843},[1050,8333,8334],{"class":1847},"Create script to automate squashing process",[1050,8336,1851],{"class":1843},[1050,8338,8339],{"class":1052,"line":4074},[1050,8340,2445],{"class":1097},[1050,8342,8343,8346,8348,8351],{"class":1052,"line":4094},[1050,8344,8345],{"class":1097},"        script_content ",[1050,8347,1101],{"class":1077},[1050,8349,8350],{"class":1160}," '''",[1050,8352,8353],{"class":1164},"#!/bin/bash\n",[1050,8355,8356],{"class":1052,"line":4112},[1050,8357,8358],{"class":1164},"# Automated migration squashing script\n",[1050,8360,8361],{"class":1052,"line":4118},[1050,8362,1299],{"emptyLinePlaceholder":1298},[1050,8364,8365],{"class":1052,"line":4123},[1050,8366,8367],{"class":1164},"set -e\n",[1050,8369,8370],{"class":1052,"line":4142},[1050,8371,1299],{"emptyLinePlaceholder":1298},[1050,8373,8374],{"class":1052,"line":4161},[1050,8375,8376],{"class":1164},"APP_NAME=$1\n",[1050,8378,8379],{"class":1052,"line":4177},[1050,8380,8381],{"class":1164},"START_MIGRATION=$2\n",[1050,8383,8384],{"class":1052,"line":4182},[1050,8385,8386],{"class":1164},"END_MIGRATION=$3\n",[1050,8388,8389],{"class":1052,"line":4187},[1050,8390,1299],{"emptyLinePlaceholder":1298},[1050,8392,8393],{"class":1052,"line":4217},[1050,8394,8395],{"class":1164},"if [ -z \"$APP_NAME\" ] || [ -z \"$START_MIGRATION\" ] || [ -z \"$END_MIGRATION\" ]; then\n",[1050,8397,8398],{"class":1052,"line":4236},[1050,8399,8400],{"class":1164},"    echo \"Usage: $0 \u003Capp_name> \u003Cstart_migration> \u003Cend_migration>\"\n",[1050,8402,8403],{"class":1052,"line":4262},[1050,8404,8405],{"class":1164},"    exit 1\n",[1050,8407,8408],{"class":1052,"line":4267},[1050,8409,8410],{"class":1164},"fi\n",[1050,8412,8413],{"class":1052,"line":4272},[1050,8414,1299],{"emptyLinePlaceholder":1298},[1050,8416,8417],{"class":1052,"line":4278},[1050,8418,8419],{"class":1164},"echo \"Starting migration squashing for $APP_NAME: $START_MIGRATION to $END_MIGRATION\"\n",[1050,8421,8422],{"class":1052,"line":4291},[1050,8423,1299],{"emptyLinePlaceholder":1298},[1050,8425,8426],{"class":1052,"line":4322},[1050,8427,8428],{"class":1164},"# Backup existing migrations\n",[1050,8430,8431],{"class":1052,"line":4327},[1050,8432,8433],{"class":1164},"echo \"Creating backup of existing migrations...\"\n",[1050,8435,8436,8439,8442],{"class":1052,"line":4351},[1050,8437,8438],{"class":1164},"cp -r $APP_NAME/migrations $APP_NAME/migrations_backup_$(date +%Y%m",[1050,8440,8441],{"class":2715},"%d",[1050,8443,8444],{"class":1164},"_%H%M%S)\n",[1050,8446,8447],{"class":1052,"line":4370},[1050,8448,1299],{"emptyLinePlaceholder":1298},[1050,8450,8451],{"class":1052,"line":4389},[1050,8452,8453],{"class":1164},"# Check current migration state\n",[1050,8455,8456],{"class":1052,"line":4423},[1050,8457,8458],{"class":1164},"echo \"Checking current migration state...\"\n",[1050,8460,8461],{"class":1052,"line":4428},[1050,8462,8463],{"class":1164},"python manage.py showmigrations $APP_NAME\n",[1050,8465,8466],{"class":1052,"line":4433},[1050,8467,1299],{"emptyLinePlaceholder":1298},[1050,8469,8470],{"class":1052,"line":5649},[1050,8471,8472],{"class":1164},"# Create squashed migration\n",[1050,8474,8475],{"class":1052,"line":5654},[1050,8476,8477],{"class":1164},"echo \"Creating squashed migration...\"\n",[1050,8479,8480],{"class":1052,"line":5659},[1050,8481,8482],{"class":1164},"python manage.py squashmigrations $APP_NAME $START_MIGRATION $END_MIGRATION\n",[1050,8484,8485],{"class":1052,"line":5677},[1050,8486,1299],{"emptyLinePlaceholder":1298},[1050,8488,8489],{"class":1052,"line":5687},[1050,8490,8491],{"class":1164},"# Test squashed migration\n",[1050,8493,8494],{"class":1052,"line":5692},[1050,8495,8496],{"class":1164},"echo \"Testing squashed migration on test database...\"\n",[1050,8498,8499],{"class":1052,"line":5698},[1050,8500,8501],{"class":1164},"python manage.py migrate --database=test\n",[1050,8503,8504],{"class":1052,"line":5729},[1050,8505,1299],{"emptyLinePlaceholder":1298},[1050,8507,8508],{"class":1052,"line":5744},[1050,8509,8510],{"class":1164},"# Validate schema\n",[1050,8512,8513],{"class":1052,"line":5757},[1050,8514,8515],{"class":1164},"echo \"Validating schema...\"\n",[1050,8517,8518,8521,8524,8527,8529],{"class":1052,"line":5768},[1050,8519,8520],{"class":1164},"python manage.py sqlmigrate $APP_NAME $(ls $APP_NAME/migrations/*squashed*.py | head -1 | sed 's/.*",[1050,8522,8523],{"class":2349},"\\\\",[1050,8525,8526],{"class":1164},"///;s/",[1050,8528,8523],{"class":2349},[1050,8530,8531],{"class":1164},".py//')\n",[1050,8533,8534],{"class":1052,"line":5778},[1050,8535,1299],{"emptyLinePlaceholder":1298},[1050,8537,8538],{"class":1052,"line":5783},[1050,8539,8540],{"class":1164},"echo \"Squashing completed successfully!\"\n",[1050,8542,8543],{"class":1052,"line":5788},[1050,8544,8545],{"class":1164},"echo \"Please review the squashed migration before deploying to production.\"\n",[1050,8547,8548],{"class":1052,"line":5794},[1050,8549,4954],{"class":1160},[1050,8551,8552],{"class":1052,"line":5804},[1050,8553,2445],{"class":1097},[1050,8555,8556,8558],{"class":1052,"line":5810},[1050,8557,3076],{"class":2366},[1050,8559,8560],{"class":1097}," script_content\n",[1050,8562,8563],{"class":1052,"line":5847},[1050,8564,1122],{"class":1097},[1050,8566,8567,8569],{"class":1052,"line":5878},[1050,8568,4477],{"class":1077},[1050,8570,4480],{"class":3415},[1050,8572,8573,8575,8578],{"class":1052,"line":5883},[1050,8574,2326],{"class":1069},[1050,8576,8577],{"class":2423}," create_squashing_validator",[1050,8579,4490],{"class":1077},[1050,8581,8582,8584,8587],{"class":1052,"line":5889},[1050,8583,2435],{"class":1843},[1050,8585,8586],{"class":1847},"Create validator for squashed migrations",[1050,8588,1851],{"class":1843},[1050,8590,8591],{"class":1052,"line":5900},[1050,8592,2445],{"class":1097},[1050,8594,8595,8597,8599,8601,8603,8605,8608],{"class":1052,"line":5913},[1050,8596,5280],{"class":1069},[1050,8598,4982],{"class":2423},[1050,8600,1078],{"class":1077},[1050,8602,2355],{"class":2341},[1050,8604,1195],{"class":1077},[1050,8606,8607],{"class":2341}," squashed_migration_name",[1050,8609,1091],{"class":1077},[1050,8611,8612,8614,8617],{"class":1052,"line":5926},[1050,8613,5290],{"class":1843},[1050,8615,8616],{"class":1847},"Validate that squashed migration is correct",[1050,8618,1851],{"class":1843},[1050,8620,8621],{"class":1052,"line":5932},[1050,8622,2968],{"class":1097},[1050,8624,8625,8628,8630,8632,8634,8636,8638,8640,8642,8644],{"class":1052,"line":5938},[1050,8626,8627],{"class":2366},"            from",[1050,8629,2370],{"class":1097},[1050,8631,1085],{"class":1077},[1050,8633,2375],{"class":1097},[1050,8635,1085],{"class":1077},[1050,8637,1082],{"class":1097},[1050,8639,1085],{"class":1077},[1050,8641,2384],{"class":1097},[1050,8643,2387],{"class":2366},[1050,8645,2390],{"class":1097},[1050,8647,8648,8650,8652,8654,8656,8658,8660,8662,8665,8667],{"class":1052,"line":5943},[1050,8649,8627],{"class":2366},[1050,8651,2370],{"class":1097},[1050,8653,1085],{"class":1077},[1050,8655,2375],{"class":1097},[1050,8657,1085],{"class":1077},[1050,8659,1082],{"class":1097},[1050,8661,1085],{"class":1077},[1050,8663,8664],{"class":1097},"state ",[1050,8666,2387],{"class":2366},[1050,8668,8669],{"class":1097}," ProjectState\n",[1050,8671,8672],{"class":1052,"line":5951},[1050,8673,2968],{"class":1097},[1050,8675,8676,8679,8681,8683,8685,8687],{"class":1052,"line":5956},[1050,8677,8678],{"class":1097},"            loader ",[1050,8680,1101],{"class":1077},[1050,8682,2404],{"class":1144},[1050,8684,1078],{"class":1077},[1050,8686,2409],{"class":1144},[1050,8688,2412],{"class":1077},[1050,8690,8691],{"class":1052,"line":5964},[1050,8692,2968],{"class":1097},[1050,8694,8695,8698,8700],{"class":1052,"line":5969},[1050,8696,8697],{"class":1097},"            validation_results ",[1050,8699,1101],{"class":1077},[1050,8701,2455],{"class":1077},[1050,8703,8704,8706,8709,8711,8713,8715],{"class":1052,"line":5976},[1050,8705,2991],{"class":1160},[1050,8707,8708],{"class":1164},"valid",[1050,8710,1161],{"class":1160},[1050,8712,2468],{"class":1077},[1050,8714,3640],{"class":1104},[1050,8716,1170],{"class":1077},[1050,8718,8719,8721,8724,8726,8728],{"class":1052,"line":5986},[1050,8720,2991],{"class":1160},[1050,8722,8723],{"class":1164},"errors",[1050,8725,1161],{"class":1160},[1050,8727,2468],{"class":1077},[1050,8729,2487],{"class":1077},[1050,8731,8732,8734,8736,8738,8740],{"class":1052,"line":5996},[1050,8733,2991],{"class":1160},[1050,8735,3650],{"class":1164},[1050,8737,1161],{"class":1160},[1050,8739,2468],{"class":1077},[1050,8741,1116],{"class":1077},[1050,8743,8744],{"class":1052,"line":6001},[1050,8745,8266],{"class":1077},[1050,8747,8748],{"class":1052,"line":6019},[1050,8749,2968],{"class":1097},[1050,8751,8752,8755],{"class":1052,"line":6029},[1050,8753,8754],{"class":2366},"            try",[1050,8756,2308],{"class":1077},[1050,8758,8759],{"class":1052,"line":6034},[1050,8760,8761],{"class":1056},"                # Get squashed migration\n",[1050,8763,8764,8767,8769,8772,8774,8776,8778,8780,8782,8784],{"class":1052,"line":6066},[1050,8765,8766],{"class":1097},"                squashed_migration ",[1050,8768,1101],{"class":1077},[1050,8770,8771],{"class":1097}," loader",[1050,8773,1085],{"class":1077},[1050,8775,3166],{"class":1144},[1050,8777,1078],{"class":1077},[1050,8779,2355],{"class":1144},[1050,8781,1195],{"class":1077},[1050,8783,8607],{"class":1144},[1050,8785,2412],{"class":1077},[1050,8787,8788],{"class":1052,"line":6071},[1050,8789,4045],{"class":1097},[1050,8791,8792],{"class":1052,"line":6077},[1050,8793,8794],{"class":1056},"                # Check replaces attribute\n",[1050,8796,8797,8799,8801,8803,8805,8808,8810,8812,8815,8817,8819,8821,8823,8826,8828,8830],{"class":1052,"line":6099},[1050,8798,3241],{"class":2366},[1050,8800,3385],{"class":2577},[1050,8802,3447],{"class":2329},[1050,8804,1078],{"class":1077},[1050,8806,8807],{"class":1144},"squashed_migration",[1050,8809,1195],{"class":1077},[1050,8811,1344],{"class":1160},[1050,8813,8814],{"class":1164},"replaces",[1050,8816,1161],{"class":1160},[1050,8818,2676],{"class":1077},[1050,8820,6454],{"class":2577},[1050,8822,3385],{"class":2577},[1050,8824,8825],{"class":1097}," squashed_migration",[1050,8827,1085],{"class":1077},[1050,8829,8814],{"class":1609},[1050,8831,2308],{"class":1077},[1050,8833,8834,8837,8839,8841,8843,8845,8847,8849],{"class":1052,"line":6104},[1050,8835,8836],{"class":1097},"                    validation_results",[1050,8838,2568],{"class":1077},[1050,8840,1161],{"class":1160},[1050,8842,8723],{"class":1164},[1050,8844,1161],{"class":1160},[1050,8846,2700],{"class":1077},[1050,8848,2596],{"class":1144},[1050,8850,1148],{"class":1077},[1050,8852,8853,8856,8859],{"class":1052,"line":6116},[1050,8854,8855],{"class":1160},"                        \"",[1050,8857,8858],{"class":1164},"Squashed migration missing 'replaces' attribute",[1050,8860,4259],{"class":1160},[1050,8862,8863],{"class":1052,"line":6122},[1050,8864,4115],{"class":1077},[1050,8866,8867],{"class":1052,"line":6139},[1050,8868,4045],{"class":1097},[1050,8870,8871],{"class":1052,"line":6144},[1050,8872,8873],{"class":1056},"                # Validate that replaced migrations exist\n",[1050,8875,8876,8878,8881,8883,8886,8888,8890,8892,8894],{"class":1052,"line":6150},[1050,8877,6937],{"class":2366},[1050,8879,8880],{"class":1097}," replaced_app",[1050,8882,1195],{"class":1077},[1050,8884,8885],{"class":1097}," replaced_name ",[1050,8887,2538],{"class":2366},[1050,8889,8825],{"class":1097},[1050,8891,1085],{"class":1077},[1050,8893,8814],{"class":1609},[1050,8895,2308],{"class":1077},[1050,8897,8898,8900,8903,8906,8908,8911,8913,8915,8917,8919,8921,8923,8925,8927],{"class":1052,"line":6156},[1050,8899,6495],{"class":2366},[1050,8901,8902],{"class":1077}," (",[1050,8904,8905],{"class":1097},"replaced_app",[1050,8907,1195],{"class":1077},[1050,8909,8910],{"class":1097}," replaced_name",[1050,8912,2676],{"class":1077},[1050,8914,3385],{"class":2577},[1050,8916,6504],{"class":2577},[1050,8918,8771],{"class":1097},[1050,8920,1085],{"class":1077},[1050,8922,2550],{"class":1609},[1050,8924,1085],{"class":1077},[1050,8926,2555],{"class":1609},[1050,8928,2308],{"class":1077},[1050,8930,8931,8934,8936,8938,8940,8942,8944,8946],{"class":1052,"line":6161},[1050,8932,8933],{"class":1097},"                        validation_results",[1050,8935,2568],{"class":1077},[1050,8937,1161],{"class":1160},[1050,8939,3650],{"class":1164},[1050,8941,1161],{"class":1160},[1050,8943,2700],{"class":1077},[1050,8945,2596],{"class":1144},[1050,8947,1148],{"class":1077},[1050,8949,8950,8953,8956,8958,8960,8962,8964,8966,8969,8971],{"class":1052,"line":6168},[1050,8951,8952],{"class":1069},"                            f",[1050,8954,8955],{"class":1164},"\"Replaced migration ",[1050,8957,2716],{"class":2715},[1050,8959,8905],{"class":1144},[1050,8961,2728],{"class":2715},[1050,8963,1085],{"class":1164},[1050,8965,2716],{"class":2715},[1050,8967,8968],{"class":1144},"replaced_name",[1050,8970,2728],{"class":2715},[1050,8972,8973],{"class":1164}," not found\"\n",[1050,8975,8976],{"class":1052,"line":6174},[1050,8977,8978],{"class":1077},"                        )\n",[1050,8980,8981],{"class":1052,"line":6190},[1050,8982,4045],{"class":1097},[1050,8984,8985],{"class":1052,"line":6195},[1050,8986,8987],{"class":1056},"                # Check dependencies\n",[1050,8989,8990,8992,8994,8996,8999,9001,9003,9005,9007],{"class":1052,"line":6201},[1050,8991,6937],{"class":2366},[1050,8993,4332],{"class":1097},[1050,8995,1195],{"class":1077},[1050,8997,8998],{"class":1097}," dep_name ",[1050,9000,2538],{"class":2366},[1050,9002,8825],{"class":1097},[1050,9004,1085],{"class":1077},[1050,9006,4346],{"class":1609},[1050,9008,2308],{"class":1077},[1050,9010,9011,9013,9015,9017,9019,9022,9024,9026,9028,9030,9032,9034,9036,9038],{"class":1052,"line":6207},[1050,9012,6495],{"class":2366},[1050,9014,8902],{"class":1077},[1050,9016,4407],{"class":1097},[1050,9018,1195],{"class":1077},[1050,9020,9021],{"class":1097}," dep_name",[1050,9023,2676],{"class":1077},[1050,9025,3385],{"class":2577},[1050,9027,6504],{"class":2577},[1050,9029,8771],{"class":1097},[1050,9031,1085],{"class":1077},[1050,9033,2550],{"class":1609},[1050,9035,1085],{"class":1077},[1050,9037,2555],{"class":1609},[1050,9039,2308],{"class":1077},[1050,9041,9042,9044,9046,9048,9050,9052,9054,9056],{"class":1052,"line":6212},[1050,9043,8933],{"class":1097},[1050,9045,2568],{"class":1077},[1050,9047,1161],{"class":1160},[1050,9049,8723],{"class":1164},[1050,9051,1161],{"class":1160},[1050,9053,2700],{"class":1077},[1050,9055,2596],{"class":1144},[1050,9057,1148],{"class":1077},[1050,9059,9060,9062,9065,9067,9069,9071,9073,9075,9078,9080],{"class":1052,"line":6218},[1050,9061,8952],{"class":1069},[1050,9063,9064],{"class":1164},"\"Dependency ",[1050,9066,2716],{"class":2715},[1050,9068,4407],{"class":1144},[1050,9070,2728],{"class":2715},[1050,9072,1085],{"class":1164},[1050,9074,2716],{"class":2715},[1050,9076,9077],{"class":1144},"dep_name",[1050,9079,2728],{"class":2715},[1050,9081,8973],{"class":1164},[1050,9083,9084],{"class":1052,"line":6257},[1050,9085,8978],{"class":1077},[1050,9087,9088],{"class":1052,"line":6293},[1050,9089,4045],{"class":1097},[1050,9091,9092],{"class":1052,"line":6298},[1050,9093,9094],{"class":1056},"                # Validate operations\n",[1050,9096,9097,9099,9101,9103,9105,9107,9109],{"class":1052,"line":6306},[1050,9098,6937],{"class":2366},[1050,9100,3429],{"class":1097},[1050,9102,2538],{"class":2366},[1050,9104,8825],{"class":1097},[1050,9106,1085],{"class":1077},[1050,9108,3438],{"class":1609},[1050,9110,2308],{"class":1077},[1050,9112,9113,9115,9117,9119,9121,9123,9125,9128,9130,9132,9135,9137,9139,9141,9143],{"class":1052,"line":6311},[1050,9114,6495],{"class":2366},[1050,9116,3447],{"class":2329},[1050,9118,1078],{"class":1077},[1050,9120,3452],{"class":1144},[1050,9122,1195],{"class":1077},[1050,9124,1344],{"class":1160},[1050,9126,9127],{"class":1164},"reversible",[1050,9129,1161],{"class":1160},[1050,9131,2676],{"class":1077},[1050,9133,9134],{"class":2577}," and",[1050,9136,3385],{"class":2577},[1050,9138,4028],{"class":1097},[1050,9140,1085],{"class":1077},[1050,9142,9127],{"class":1609},[1050,9144,2308],{"class":1077},[1050,9146,9147,9149,9151,9153,9155,9157,9159,9161],{"class":1052,"line":6318},[1050,9148,8933],{"class":1097},[1050,9150,2568],{"class":1077},[1050,9152,1161],{"class":1160},[1050,9154,3650],{"class":1164},[1050,9156,1161],{"class":1160},[1050,9158,2700],{"class":1077},[1050,9160,2596],{"class":1144},[1050,9162,1148],{"class":1077},[1050,9164,9165,9167,9170,9172,9174,9176,9178,9180,9182,9184],{"class":1052,"line":6328},[1050,9166,8952],{"class":1069},[1050,9168,9169],{"class":1164},"\"Operation ",[1050,9171,2716],{"class":2715},[1050,9173,3452],{"class":1144},[1050,9175,1085],{"class":1077},[1050,9177,4034],{"class":4033},[1050,9179,1085],{"class":1077},[1050,9181,6776],{"class":4033},[1050,9183,2728],{"class":2715},[1050,9185,9186],{"class":1164}," is not reversible\"\n",[1050,9188,9189],{"class":1052,"line":6338},[1050,9190,8978],{"class":1077},[1050,9192,9193],{"class":1052,"line":6343},[1050,9194,2968],{"class":1097},[1050,9196,9197,9200,9203,9206,9209],{"class":1052,"line":6358},[1050,9198,9199],{"class":2366},"            except",[1050,9201,9202],{"class":3415}," Exception",[1050,9204,9205],{"class":2366}," as",[1050,9207,9208],{"class":1097}," e",[1050,9210,2308],{"class":1077},[1050,9212,9213,9216,9218,9220,9222,9224,9226,9228],{"class":1052,"line":6368},[1050,9214,9215],{"class":1097},"                validation_results",[1050,9217,2568],{"class":1077},[1050,9219,1161],{"class":1160},[1050,9221,8708],{"class":1164},[1050,9223,1161],{"class":1160},[1050,9225,2574],{"class":1077},[1050,9227,2358],{"class":1077},[1050,9229,3869],{"class":1104},[1050,9231,9232,9234,9236,9238,9240,9242,9244,9246,9248,9251,9254,9256,9259,9261,9263],{"class":1052,"line":6373},[1050,9233,9215],{"class":1097},[1050,9235,2568],{"class":1077},[1050,9237,1161],{"class":1160},[1050,9239,8723],{"class":1164},[1050,9241,1161],{"class":1160},[1050,9243,2700],{"class":1077},[1050,9245,2596],{"class":1144},[1050,9247,1078],{"class":1077},[1050,9249,9250],{"class":1069},"f",[1050,9252,9253],{"class":1164},"\"Error loading squashed migration: ",[1050,9255,2716],{"class":2715},[1050,9257,9258],{"class":1144},"e",[1050,9260,2728],{"class":2715},[1050,9262,3891],{"class":1164},[1050,9264,2412],{"class":1077},[1050,9266,9267],{"class":1052,"line":6383},[1050,9268,2968],{"class":1097},[1050,9270,9271,9273],{"class":1052,"line":6388},[1050,9272,3394],{"class":2366},[1050,9274,9275],{"class":1097}," validation_results\n",[1050,9277,9278],{"class":1052,"line":6394},[1050,9279,2445],{"class":1097},[1050,9281,9282,9284],{"class":1052,"line":6405},[1050,9283,3076],{"class":2366},[1050,9285,9286],{"class":1097}," validate_squashed_migration\n",[1026,9288,9289],{},"Migration squashing is a powerful technique for maintaining clean migration histories and improving performance. Proper planning, testing, and deployment strategies ensure that squashing enhances rather than complicates your Django project's migration management.",[9291,9292,9293],"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 .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}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 .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 .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}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 .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 .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}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 .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 .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}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 .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--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 .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .s6DHA, html code.shiki .s6DHA{--shiki-light:#6182B8;--shiki-default:#A65E2B;--shiki-dark:#C99076}",{"title":1045,"searchDepth":1053,"depth":1060,"links":9295},[9296,9300,9303],{"id":1032,"depth":1060,"text":1033,"children":9297},[9298,9299],{"id":1037,"depth":1066,"text":1038},{"id":2292,"depth":1066,"text":2293},{"id":4440,"depth":1060,"text":4441,"children":9301},[9302],{"id":4444,"depth":1066,"text":4445},{"id":7197,"depth":1060,"text":7198,"children":9304},[9305],{"id":7201,"depth":1066,"text":7202},"md",null,{},{"title":374,"description":1028},"zE0Eg98A_pAZBeNT5QnIdLIXy_XR5py5HvCXjg91prE",[9312,9314],{"title":370,"path":371,"stem":372,"description":9313,"children":-1},"Data migrations allow you to transform, populate, or clean up data during schema changes. Unlike schema migrations that modify database structure, data migrations work with the actual data in your database. Understanding how to write effective data migrations is crucial for maintaining data integrity during application evolution.",{"title":378,"path":379,"stem":380,"description":9315,"children":-1},"Django migrations need to serialize Python values into migration files so they can be recreated when migrations run. Understanding how Django serializes values and how to handle custom serialization is crucial for creating robust migrations with complex data types and custom objects.",1772474925373]