Django 5.2: What’s New in the Upcoming LTS Release?
Django 5.2, expected in April 2025, is shaping up to be a game-changing release, packed with new features, performance improvements, and…

Django 5.2, expected in April 2025, is shaping up to be a game-changing release, packed with new features, performance improvements, and long-term support (LTS) status. If you’re a Django developer, this update brings exciting capabilities, including automatic model imports in the shell, composite primary keys, improved form rendering, and more asynchronous authentication methods.
This article covers the most notable additions and changes in Django 5.2, including backward-incompatible changes that may require adjustments in your projects.

Django 5.2 as a Long-Term Support Release
Django 5.2 will receive security updates for at least three years, making it a stable choice for production applications. Support for the previous LTS release, Django 4.2, will end in April 2026.
Python Compatibility
Django 5.2 supports Python 3.10, 3.11, 3.12, and the newly introduced Python 3.13. As always, it’s recommended to use the latest stable Python release for the best security and performance.
Key Features in Django 5.2
1. Automatic Model Imports in the Django Shell
One of the most developer-friendly changes is the automatic import of models when using the Django shell. Now, when you run:
python manage.py shell --verbosity=2
Django will automatically import models from installed apps, making debugging and interactive testing much smoother.
2. Composite Primary Keys
Django finally introduces composite primary keys, a long-awaited feature for developers working with multi-column primary keys. Instead of relying on third-party libraries, you can now define composite primary keys directly in Django models:
from django.db import models
class Release(models.Model):
pk = models.CompositePrimaryKey("version", "name")
version = models.IntegerField()
name = models.CharField(max_length=20)
This feature enhances database design flexibility and is particularly useful when working with legacy databases.
3. Simplified BoundField Overrides in Forms
Before Django 5.2, customizing form field rendering required overriding Field.get_bound_field()
. Now, Django simplifies this by introducing new attributes at different levels:
BaseRenderer.bound_field_class
(project level)Form.bound_field_class
(form level)Field.bound_field_class
(field level)
For example, you can now customize how form fields render like this:
from django import forms
class CustomBoundField(forms.BoundField):
custom_class = "custom"
def css_classes(self, extra_classes=None):
result = super().css_classes(extra_classes)
if self.custom_class not in result:
result += f" {self.custom_class}"
return result.strip()
class CustomForm(forms.Form):
bound_field_class = CustomBoundField
name = forms.CharField(label="Your Name", max_length=100)
email = forms.EmailField(label="Your Email")
This change makes Django forms more customizable and easier to extend.
Other Notable Improvements
Django Admin Enhancements
- The admin template (
admin/base.html
) now includes anextrabody
block, making it easier to add custom scripts before the closing</body>
tag. URLField
values now render as clickable links in the Django admin.
Improved Asynchronous Support in Authentication
Django 5.2 introduces asynchronous authentication methods, reducing context switching in async applications:
UserManager.acreate_user()
andUserManager.acreate_superuser()
User.aget_user_permissions()
,User.ahas_perm()
, etc.ModelBackend.aauthenticate()
and async permission checks
This enhancement is a step toward better async support in Django’s authentication system.
Database Improvements
- MySQL now defaults to
utf8mb4
instead ofutf8mb3
, improving character set support. - Oracle now supports connection pooling, improving performance for large applications.
- PostgreSQL 17 support:
QuerySet.explain()
now supportsmemory
andserialize
options for better query optimization. - JSON support improvements: A new
JSONArray
function allows creating JSON arrays directly from field values.
New Form Widgets
Django 5.2 introduces new form widgets for modern web applications:
- ColorInput → Renders as
<input type="color">
- SearchInput → Renders as
<input type="search">
- TelInput → Renders as
<input type="tel">
These widgets enhance form usability by leveraging native browser capabilities.
New HTTP and URL Handling Features
- New
HttpResponse.text
property for retrieving response content as a string. - New
HttpRequest.get_preferred_type()
method to determine the client's preferred media type. reverse()
now supports query strings and fragments, making URL generation more flexible.
Backward-Incompatible Changes in Django 5.2
While Django 5.2 brings many improvements, some changes may require updates in existing projects:
- Dropped support for PostgreSQL 13 (support ends in November 2025).
- Removed support for PostGIS 3.0 and GDAL 3.0.
- MySQL default character set changed from
utf8mb3
toutf8mb4
(legacy databases may need updates). - CharField
max_length
is now optional on SQLite, aligning with its support for unlimitedVARCHAR
columns. - New Model._is_pk_set() method allows checking if a model’s primary key is set.
Final Thoughts
Django 5.2 is a major step forward, introducing long-requested features like composite primary keys, better async authentication, and improved form rendering. The automatic model imports in the shell and new admin enhancements also improve the developer experience.
Since Django 5.2 is an LTS release, it’s a great choice for long-term projects requiring stability and security updates for years to come.
If you’re upgrading from Django 5.1 or earlier, make sure to check the official Django 5.2 release notes and test your project for backward-incompatible changes.
Are You Excited About Django 5.2?
Let me know in the comments which feature you’re looking forward to the most!