Django 6.2 release notes - UNDER DEVELOPMENTLink to this heading
Expected April 2027
Welcome to Django 6.2!
These release notes cover the new features, as well as some backwards incompatible changes you should be aware of when upgrading from Django 6.1 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.2 is designated as a long-term support release. It will receive security updates for at least three years after its release. Support for the previous LTS, Django 5.2, will end in April 2028.
Python compatibilityLink to this heading
Django 6.2 supports Python 3.12, 3.13 and 3.14. We highly recommend and only officially support the latest release of each series.
What’s new in Django 6.2Link to this heading
Adopting calendar versioningLink to this heading
Following DEP 20, the releases previously planned as Django 7.0 and 7.1 are
now Django 2028 and 2029. Accordingly, the deprecation warning classes are
renamed to match the calendar version in which the features they mark are
removed: RemovedInDjango70Warning becomes RemovedInDjango2028Warning,
and RemovedInDjango71Warning becomes RemovedInDjango2029Warning.
Minor featuresLink to this heading
django.contrib.adminLink to this heading
…
django.contrib.admindocsLink to this heading
…
django.contrib.authLink to this heading
The default iteration count for the PBKDF2 password hasher is increased from 1,500,000 to 1,800,000.
django.contrib.contenttypesLink to this heading
…
django.contrib.gisLink to this heading
DataSourcenow preserves millisecond precision when reading time and datetime fields.
django.contrib.messagesLink to this heading
…
django.contrib.postgresLink to this heading
…
django.contrib.redirectsLink to this heading
…
django.contrib.sessionsLink to this heading
…
django.contrib.sitemapsLink to this heading
…
django.contrib.sitesLink to this heading
…
django.contrib.staticfilesLink to this heading
…
Asynchronous viewsLink to this heading
…
CacheLink to this heading
Subclasses of
BaseDatabaseCachenow support culling on a percentage of writes as an optimization. The default is 10%, and may be configured using theCULL_PROBABILITYoption.
CSPLink to this heading
…
CSRFLink to this heading
…
Database backendsLink to this heading
…
DecoratorsLink to this heading
…
EmailLink to this heading
The
ADMINS,DEFAULT_FROM_EMAIL,MANAGERS, andSERVER_EMAILsettings now supportAddressobjects.
Error ReportingLink to this heading
…
File StorageLink to this heading
…
File UploadsLink to this heading
…
FormsLink to this heading
…
Generic ViewsLink to this heading
…
InternationalizationLink to this heading
…
LoggingLink to this heading
…
Management CommandsLink to this heading
The new
listurlscommand lists the URLs from the project’s root URLconf, including the view class or function (and name, if present).The
makemigrationscommand now tracks all changes to unmanaged models, including field additions, removals, alterations, constraints, and model renames. After upgrading, you will see new migrations detected for unmanaged models that have changed since their creation.Whether to suppress an
ImportErrorescaping from a settings module is configurable by the newBaseCommand.requires_settingsattribute (defaultTrue). In previous versions, such errors were always suppressed.
MigrationsLink to this heading
…
ModelsLink to this heading
…
Requests and ResponsesLink to this heading
…
SecurityLink to this heading
…
SerializationLink to this heading
…
SignalsLink to this heading
…
TasksLink to this heading
…
TemplatesLink to this heading
…
TestsLink to this heading
force_login()now skips members ofAUTHENTICATION_BACKENDSnot implementing(a)get_user(), e.g. permission-only backends.
URLsLink to this heading
…
UtilitiesLink to this heading
utils.module_loading.import_string()now supports modules. Previously, top-level modules did not work, and submodules only worked if already imported.The new
django.utils.asyncio.maybe_aclosing()returns a context manager that callsaclose()on a caller-provided iterator only if it defines one.…
ValidatorsLink to this heading
EmailValidatornow includes the invalidusernameordomainin theparamsdict of theValidationErrorit raises. The newparse_address(),validate(),validate_domain(), andvalidate_username()methods can be overridden to customize how the address is parsed and validated.
Backwards incompatible changes in 6.2Link to this heading
Database backend APILink to this heading
This section describes changes that may be needed in third-party database backends.
…
django.contrib.adminLink to this heading
The admin
view_on_siteURL now consistently returns an HTTP 403 response when a staff user lacks view or change permission for the target model.The admin history view now checks permissions before object existence, consistently returning an HTTP 403 response for staff users without the view or change permission regardless of whether the object exists.
The undocumented
django.contrib.admin.testsmodule was removed.
django.contrib.gisLink to this heading
The seconds value returned by
as_datetime()is now ac_floatrather than ac_int.Support for PostGIS 3.2 is removed.
Support for GDAL 3.3 and 3.4 is removed.
Support for GEOS 3.10 is removed.
ModelsLink to this heading
Unsaved instances with a composite primary key or a
db_defaultprimary key no longer compare equal to other instances.django.db.models.GenericIPAddressFieldnow validates IPv6 input strictly when saving and querying. Invalid IPv6 addresses now raiseValidationErrorinstead of being silently accepted, and surrounding whitespace is stripped.
Requests and responsesLink to this heading
Most Django-provided middleware now set
async_capable = Falseto avoid repetitive context switching inMiddlewareMixin.__acall__()under ASGI. For atypical use cases, e.g. high in-process concurrency over non-ORM I/O, where no thread is otherwise held, the repetitive context switching may be preferable to pinning a thread per request (see Performance). Such deployments can restore the prior behavior by settingasync_capable = True; see MiddlewareMixin.RemoteUserMiddlewareis unaffected, because it does not useMiddlewareMixin. Neither isLoginRequiredMiddlewarenordjango.contrib.admindocs.middleware.XViewMiddlewareaffected, as they did not implementprocess_request()orprocess_response().
TestsLink to this heading
The undocumented
django.test.seleniummodule was removed.
Dropped support for PostgreSQL 15Link to this heading
Upstream support for PostgreSQL 15 ends in November 2027. Django 6.2 supports PostgreSQL 16 and higher.
MiscellaneousLink to this heading
To facilitate the deprecation of the
safeparameter ofJsonResponse, it now defaults toFalse, because the pollution vulnerability in theArrayprototype was fixed in ES5.DjangoJSONEncodernow omits the millisecond component of serializeddatetime.datetimeanddatetime.timeobjects if they have zero milliseconds. For example,datetime.datetime(2000, 1, 1, 0, 0, 0, 1)now serializes to"2000-01-01T00:00:00"rather than"2000-01-01T00:00:00.000".utils.module_loading.import_string()now deterministically favors submodules in ambiguous cases where depending on prior import state, a same-named attribute of the parent module might have been returned instead.The minimum supported version of
asgirefis increased from 3.9.1 to 3.12.1.The minimum supported version of
oracledbis increased from 2.3.0 to 4.0.2.In the asynchronous request path, error responses (such as those rendered by
handler404andhandler500) are now rendered on the request’s thread-sensitive thread, rather than on a shared thread pool, so that database connections used during error handling are managed byclose_old_connections().
Features deprecated in 6.2Link to this heading
ValidatorsLink to this heading
The undocumented
EmailValidator.validate_domain_part()method is deprecated in favor of the newvalidate_domain()method.
MiscellaneousLink to this heading
Indexing
django.VERSIONfrom its third component on, reading it in a way which depends on its length, such as unpacking it or callinglen()on it, and comparing it against three or more components are all deprecated. Under the calendar versioning adopted in DEP 20, versions areYYYY[.N]and have no minor component, so from Django 2028django.VERSIONhas four components,(year, patch, status, iteration). Use the.feature,.patch,.status, and.iterationattributes, which give the same answers under both versioning schemes:django.VERSION.feature # (6, 2) for 6.2.1, and (2028,) for 2028.1 django.VERSION.patch # 1 for both 6.2.1 and 2028.1Comparisons against one or two components, such as
django.VERSION >= (6, 2), are unaffected.The
MiddlewareMixinclass moved fromdjango.utils.deprecationtodjango.middleware. The old import path is deprecated.The
safeparameter is deprecated fromJsonResponse. Omitting the argument is equivalent to the priorsafe=Falseusage.Calling
QuerySet.aiterator()afterprefetch_related()without providing achunk_sizeis deprecated. It currently falls back to achunk_sizeof 2000, but aValueErrorwill be raised in Django 2029.Omitting the
tzinfoargument ofExtractandTruncdatabase functions when used in migrations (for example as adb_default) andUSE_TZisTrueis deprecated. The timezone information is not captured during migration serialization, which can lead to inconsistent behavior ifTIME_ZONEchanges. Pass thetzinfoargument explicitly to suppress this warning. In Django 2029, the current timezone will be captured automatically whentzinfois omitted.