2.2 released 1 April 2019, latest 2.2.28.
Django 2.2 reached end of life on 11 April 2022.
What changed
Django 2.2 added model-level database constraints through Meta.constraints, including CheckConstraint and UniqueConstraint, allowing more integrity rules to be created and managed by migrations rather than only enforced in application code. It added conditional, or partial, indexes through Index.condition and extended bulk operations with bulk_update() and bulk_create(ignore_conflicts=True). The cycle also continued Django’s database-backend and Python-runtime compatibility work, while introducing deprecations that later releases remove. Django 2.2 was designated a long-term-support line, but it has now reached end of life.
What staying costs
An end-of-life Django 2.2 deployment no longer receives upstream security fixes, bug fixes, or compatibility updates. Security issues in Django itself, and incompatibilities with newer Python versions, database drivers, browsers, operating systems, and third-party packages, must be accepted, mitigated locally, or resolved through a migration. Dependency maintainers increasingly drop old Django support, which can leave teams unable to update a vulnerable or otherwise necessary package without widening the upgrade. The longer the application remains on 2.2, the more deprecated APIs and behavioral changes accumulate between it and a supported target, increasing the chance that the eventual upgrade becomes a larger, less testable project.
What to do
First, update the application to the latest available Django 2.2 patch release and ensure the test suite, migrations, deployment process, and dependency lock files are reproducible. Inventory installed applications, custom model fields, middleware, template tags, authentication integrations, database-specific SQL, and uses of deprecated Django APIs. Select a currently supported Django target that is compatible with the required Python runtime and third-party packages. Upgrade in controlled stages, reviewing the release notes and deprecation guidance for each intervening Django feature release, running the full test suite and migration checks at every stage. Test against production-like databases and traffic patterns, particularly constraint migrations, bulk writes, authentication flows, admin customizations, URL routing, and async-adjacent deployment components. Deploy with rollback plans and monitoring, then remove compatibility shims and obsolete dependencies once the supported target is stable.
We can tell you what moving off Django 2.2 involves.
What it takes to move off Django 2.2 depends on what you built on it — the version you are on, how much depends on it, and how much of the work is mechanical. Leave your email with this version and we can tell you what that looks like for you.
Not sure yet? Get my plan
