4.1 released 3 August 2022, latest 4.1.13.
Django 4.1 reached end of life on 1 December 2023.
What changed
Django 4.1 added an asynchronous ORM interface for query operations: many QuerySet methods that execute SQL gained a-prefixed asynchronous counterparts, and QuerySets can be iterated asynchronously. This enabled async views and consumers to avoid blocking on supported ORM calls, but database transactions remained synchronous-only and required a synchronous wrapper. Model constraint validation was integrated into model validation, so CheckConstraint and UniqueConstraint rules can be evaluated by Model.full_clean() before a database write. Forms gained Form.as_div() and associated div-based rendering templates. The cycle also added the scrypt password hasher, providing a memory-hard password hashing option alongside the existing hashers.
What staying costs
Django 4.1 has reached end of life, so its maintainers no longer provide security fixes, bug fixes, or compatibility updates for this line. Continuing to run it leaves the application responsible for assessing and mitigating framework-level vulnerabilities, including issues in request handling, authentication, template processing, and ORM behavior. Dependency and platform upgrades become progressively harder because newer supported Python versions, database drivers, and ecosystem packages may no longer test against Django 4.1. Delaying the upgrade also increases the eventual change set: deprecated APIs accumulate, third-party packages drop compatibility, and local workarounds may become embedded in application code. Teams using the async ORM should treat its limitations carefully, particularly around transactions and synchronous libraries called from async code.
What to do
Move first to the newest available maintenance release in the 4.1 line, run the full test suite, and remove all Django deprecation warnings before advancing. Choose a currently supported Django target that is compatible with the team’s required Python version and third-party packages, then upgrade through successive feature releases rather than skipping untested compatibility steps. Review the Django release notes and deprecation timeline for every intervening release, and test the upgrade against production-like database and cache configurations. Audit model validation flows because constraints may now raise validation errors during full_clean(), and distinguish that behavior from database-enforced integrity errors. For async code, verify that ORM calls use the supported asynchronous APIs where appropriate, keep transactional work in synchronous functions invoked through an async-safe adapter, and test for accidental synchronous calls in async request paths. Finally, exercise authentication, password reset, form rendering, migrations, admin workflows, and integration boundaries in staging before deployment, with a rollback plan and monitored rollout.
We can tell you what moving off Django 4.1 involves.
What it takes to move off Django 4.1 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
