Expected December 2025
Welcome to Django 6.0!
These release notes cover the new features, as well as some backwards incompatible changes you’ll want to be aware of when upgrading from Django 5.2 or earlier. We’ve begun the deprecation process for some features.
See the How to upgrade Django to a newer version guide if you’re updating an existing project.
Django 6.0 supports Python 3.12 and 3.13. We highly recommend and only officially support the latest release of each series.
The Django 5.2.x series is the last to support Python 3.10 and 3.11.
Following the release of Django 6.0, we suggest that third-party app authors
drop support for all versions of Django prior to 5.2. At that time, you should
be able to run your package’s tests using python -Wd so that deprecation
warnings appear. After making the deprecation warning fixes, your app should be
compatible with Django 6.0.
django.contrib.admin¶…
django.contrib.admindocs¶The new AdminSite.password_change_form attribute allows customizing
the form used in the admin site password change view.
django.contrib.auth¶The default iteration count for the PBKDF2 password hasher is increased from 1,000,000 to 1,200,000.
django.contrib.contenttypes¶…
django.contrib.gis¶The new GEOSGeometry.hasm property checks whether the geometry has
the M dimension.
The new Rotate database
function rotates a geometry by a specified angle around the origin or a
specified point.
django.contrib.messages¶…
django.contrib.postgres¶…
django.contrib.redirects¶…
django.contrib.sessions¶…
django.contrib.sitemaps¶…
django.contrib.sites¶…
django.contrib.staticfiles¶…
…
…
…
…
…
…
…
…
…
…
…
…
Squashed migrations can now themselves be squashed before being transitioned to normal migrations.
Constraints now implement a check()
method that is already registered with the check framework.
The new order_by argument for Aggregate allows
specifying the ordering of the elements in the result.
The new Aggregate.allow_order_by class attribute determines whether
the aggregate function allows passing an order_by keyword argument.
The new StringAgg aggregate returns the input
values concatenated into a string, separated by the delimiter string.
This aggregate was previously supported only for PostgreSQL.
…
…
…
…
The new variable forloop.length is now available within a for
loop.
…
…
…
…
This section describes changes that may be needed in third-party database backends.
BaseDatabaseCreation.create_test_db(serialize) is deprecated. Use
serialize_db_to_string() instead.
Upstream support for MariaDB 10.5 ends in June 2025. Django 6.0 supports MariaDB 10.6 and higher.
Because Python 3.12 is now the minimum supported version for Django, any optional dependencies must also meet that requirement. The following versions of each library are the first to add or confirm compatibility with Python 3.12:
aiosmtpd 1.4.5
argon2-cffi 23.1.0
bcrypt 4.1.1
geoip2 4.8.0
Pillow 10.1.0
mysqlclient 2.2.1
numpy 1.26.0
PyYAML 6.0.2
psycopg 3.1.12
psycopg2 2.9.9
redis-py 5.1.0
selenium 4.23.0
sqlparse 0.5.0
tblib 3.0.0
…
BaseDatabaseCreation.create_test_db(serialize) is deprecated. Use
serialize_db_to_string() instead.
The PostgreSQL StringAgg class is deprecated in favor of the generally
available StringAgg class.
The PostgreSQL OrderableAggMixin is deprecated in favor of the
order_by attribute now available on the Aggregate class.
These features have reached the end of their deprecation cycle and are removed in Django 6.0.
See Features deprecated in 5.0 for details on these changes, including how to remove usage of these features.
Support for passing positional arguments to BaseConstraint is removed.
The DjangoDivFormRenderer and Jinja2DivFormRenderer transitional form
renderers are removed.
BaseDatabaseOperations.field_cast_sql() is removed.
request is required in the signature of ModelAdmin.lookup_allowed()
subclasses.
Support for calling format_html() without passing args or kwargs is
removed.
The default scheme for forms.URLField changed from "http" to
"https".
The FORMS_URLFIELD_ASSUME_HTTPS transitional setting is removed.
The django.db.models.sql.datastructures.Join no longer fallback to
get_joining_columns().
The get_joining_columns() method of ForeignObject and
ForeignObjectRel is removed.
The ForeignObject.get_reverse_joining_columns() method is be removed.
Support for cx_Oracle is removed.
The ChoicesMeta alias to django.db.models.enums.ChoicesType is
removed.
The Prefetch.get_current_queryset() method is removed.
The get_prefetch_queryset() method of related managers and descriptors is
removed.
get_prefetcher() and prefetch_related_objects() no longer fallback to
get_prefetch_queryset().
See Features deprecated in 5.1 for details on these changes, including how to remove usage of these features.
django.urls.register_converter() no longer allows overriding existing
converters.
The ModelAdmin.log_deletion() and LogEntryManager.log_action()
methods are removed.
The undocumented django.utils.itercompat.is_iterable() function and the
django.utils.itercompat module is removed.
The django.contrib.gis.geoip2.GeoIP2.coords() method is removed.
The django.contrib.gis.geoip2.GeoIP2.open() method is removed.
Support for passing positional arguments to Model.save() and
Model.asave() is removed.
The setter for django.contrib.gis.gdal.OGRGeometry.coord_dim is removed.
The check keyword argument of CheckConstraint is removed.
The get_cache_name() method of FieldCacheMixin is removed.
The OS_OPEN_FLAGS attribute of
FileSystemStorage is removed.
Mar 04, 2025