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