{"title":"Django 3.2 release notes","version":"dev","locale":"en","docname":"releases/3.2","url":"/en/dev/releases/3.2/","canonical":"https://djangodocs.dev/en/dev/releases/3.2/","summary":"Welcome to Django 3.2! These release notes cover the new features, as well as some backwards incompatible changes you’ll want to be aware of when upgrading…","html":"<h1>Django 3.2 release notes<a class=\"heading-anchor\" href=\"#django-3-2-release-notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p><em>April 6, 2021</em></p>\n<p>Welcome to Django 3.2!</p>\n<p>These release notes cover the <a class=\"reference internal\" href=\"#whats-new-3-2\"><span class=\"std std-ref\">new features</span></a>, as well as\nsome <a class=\"reference internal\" href=\"#backwards-incompatible-3-2\"><span class=\"std std-ref\">backwards incompatible changes</span></a> you’ll\nwant to be aware of when upgrading from Django 3.1 or earlier. We’ve\n<a class=\"reference internal\" href=\"#deprecated-features-3-2\"><span class=\"std std-ref\">begun the deprecation process for some features</span></a>.</p>\n<p>See the <a class=\"reference internal\" href=\"/en/dev/howto/upgrade-version/\"><span class=\"doc\">How to upgrade Django to a newer version</span></a> guide if you’re updating an existing\nproject.</p>\n<p>Django 3.2 is designated as a <a class=\"reference internal\" href=\"/en/dev/internals/release-process/#term-Long-term-support-release\"><span class=\"xref std std-term\">long-term support release</span></a>. It will receive security updates for at least\nthree years after its release. Support for the previous LTS, Django 2.2, will\nend in April 2022.</p>\n<section id=\"python-compatibility\">\n<h2>Python compatibility<a class=\"heading-anchor\" href=\"#python-compatibility\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django 3.2 supports Python 3.6, 3.7, 3.8, 3.9, and 3.10 (as of 3.2.9). We\n<strong>highly recommend</strong> and only officially support the latest release of each\nseries.</p>\n</section>\n<section id=\"what-s-new-in-django-3-2\">\n<span id=\"whats-new-3-2\"></span><h2>What’s new in Django 3.2<a class=\"heading-anchor\" href=\"#what-s-new-in-django-3-2\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"automatic-appconfig-discovery\">\n<h3>Automatic <a class=\"reference internal\" href=\"/en/dev/ref/applications/#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> discovery<a class=\"heading-anchor\" href=\"#automatic-appconfig-discovery\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Most pluggable applications define an <a class=\"reference internal\" href=\"/en/dev/ref/applications/#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> subclass\nin an <code class=\"docutils literal notranslate\">apps.py</code> submodule. Many define a <code class=\"docutils literal notranslate\">default_app_config</code> variable\npointing to this class in their <code class=\"docutils literal notranslate\">__init__.py</code>.</p>\n<p>When the <code class=\"docutils literal notranslate\">apps.py</code> submodule exists and defines a single\n<a class=\"reference internal\" href=\"/en/dev/ref/applications/#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> subclass, Django now uses that configuration\nautomatically, so you can remove <code class=\"docutils literal notranslate\">default_app_config</code>.</p>\n<p><code class=\"docutils literal notranslate\">default_app_config</code> made it possible to declare only the application’s path\nin <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> (e.g. <code class=\"docutils literal notranslate\">'django.contrib.admin'</code>) rather than the\napp config’s path (e.g. <code class=\"docutils literal notranslate\">'django.contrib.admin.apps.AdminConfig'</code>). It was\nintroduced for backwards-compatibility with the former style, with the intent\nto switch the ecosystem to the latter, but the switch didn’t happen.</p>\n<p>With automatic <code class=\"docutils literal notranslate\">AppConfig</code> discovery, <code class=\"docutils literal notranslate\">default_app_config</code> is no longer\nneeded. As a consequence, it’s deprecated.</p>\n<p>See <a class=\"reference internal\" href=\"/en/dev/ref/applications/#configuring-applications-ref\"><span class=\"std std-ref\">Configuring applications</span></a> for full details.</p>\n</section>\n<section id=\"customizing-type-of-auto-created-primary-keys\">\n<h3>Customizing type of auto-created primary keys<a class=\"heading-anchor\" href=\"#customizing-type-of-auto-created-primary-keys\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>When defining a model, if no field in a model is defined with\n<a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.Field.primary_key\" title=\"django.db.models.Field.primary_key\"><code class=\"xref py py-attr docutils literal notranslate\">primary_key=True</code></a> an implicit\nprimary key is added. The type of this implicit primary key can now be\ncontrolled via the <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-DEFAULT_AUTO_FIELD\"><code class=\"xref std std-setting docutils literal notranslate\">DEFAULT_AUTO_FIELD</code></a> setting and\n<a class=\"reference internal\" href=\"/en/dev/ref/applications/#django.apps.AppConfig.default_auto_field\" title=\"django.apps.AppConfig.default_auto_field\"><code class=\"xref py py-attr docutils literal notranslate\">AppConfig.default_auto_field</code></a>\nattribute. No more needing to override primary keys in all models.</p>\n<p>Maintaining the historical behavior, the default value for\n<a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-DEFAULT_AUTO_FIELD\"><code class=\"xref std std-setting docutils literal notranslate\">DEFAULT_AUTO_FIELD</code></a> is <a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\">AutoField</code></a>. Starting\nwith 3.2 new projects are generated with <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-DEFAULT_AUTO_FIELD\"><code class=\"xref std std-setting docutils literal notranslate\">DEFAULT_AUTO_FIELD</code></a> set to\n<a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.BigAutoField\" title=\"django.db.models.BigAutoField\"><code class=\"xref py py-class docutils literal notranslate\">BigAutoField</code></a>. Also, new apps are generated with\n<a class=\"reference internal\" href=\"/en/dev/ref/applications/#django.apps.AppConfig.default_auto_field\" title=\"django.apps.AppConfig.default_auto_field\"><code class=\"xref py py-attr docutils literal notranslate\">AppConfig.default_auto_field</code></a>\nset to <a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.BigAutoField\" title=\"django.db.models.BigAutoField\"><code class=\"xref py py-class docutils literal notranslate\">BigAutoField</code></a>. In a future Django release the\ndefault value of <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-DEFAULT_AUTO_FIELD\"><code class=\"xref std std-setting docutils literal notranslate\">DEFAULT_AUTO_FIELD</code></a> will be changed to\n<a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.BigAutoField\" title=\"django.db.models.BigAutoField\"><code class=\"xref py py-class docutils literal notranslate\">BigAutoField</code></a>.</p>\n<p>To avoid unwanted migrations in the future, either explicitly set\n<a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-DEFAULT_AUTO_FIELD\"><code class=\"xref std std-setting docutils literal notranslate\">DEFAULT_AUTO_FIELD</code></a> to <a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\">AutoField</code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>DEFAULT_AUTO_FIELD <span class=\"o\">=</span> <span class=\"s2\">&quot;django.db.models.AutoField&quot;</span>\n</code></pre></div>\n<p>or configure it on a per-app basis:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.apps</span> <span class=\"kn\">import</span> AppConfig\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyAppConfig</span><span class=\"p\">(</span>AppConfig<span class=\"p\">):</span>\n    default_auto_field <span class=\"o\">=</span> <span class=\"s2\">&quot;django.db.models.AutoField&quot;</span>\n    name <span class=\"o\">=</span> <span class=\"s2\">&quot;my_app&quot;</span>\n</code></pre></div>\n<p>or on a per-model basis:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyModel</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"nb\">id</span> <span class=\"o\">=</span> models<span class=\"o\">.</span>AutoField<span class=\"p\">(</span>primary_key<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>In anticipation of the changing default, a system check will provide a warning\nif you do not have an explicit setting for <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-DEFAULT_AUTO_FIELD\"><code class=\"xref std std-setting docutils literal notranslate\">DEFAULT_AUTO_FIELD</code></a>.</p>\n<p>When changing the value of <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-DEFAULT_AUTO_FIELD\"><code class=\"xref std std-setting docutils literal notranslate\">DEFAULT_AUTO_FIELD</code></a>, migrations for the\nprimary key of existing auto-created through tables cannot be generated\ncurrently. See the <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-DEFAULT_AUTO_FIELD\"><code class=\"xref std std-setting docutils literal notranslate\">DEFAULT_AUTO_FIELD</code></a> docs for details on migrating\nsuch tables.</p>\n</section>\n<section id=\"functional-indexes\">\n<span id=\"new-functional-indexes\"></span><h3>Functional indexes<a class=\"heading-anchor\" href=\"#functional-indexes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The new <a class=\"reference internal\" href=\"/en/dev/ref/models/indexes/#django.db.models.Index.expressions\" title=\"django.db.models.Index.expressions\"><code class=\"xref py py-attr docutils literal notranslate\">*expressions</code></a> positional\nargument of <a class=\"reference internal\" href=\"/en/dev/ref/models/indexes/#django.db.models.Index\" title=\"django.db.models.Index\"><code class=\"xref py py-class docutils literal notranslate\">Index()</code></a> enables creating\nfunctional indexes on expressions and database functions. For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> F<span class=\"p\">,</span> Index<span class=\"p\">,</span> Value\n<span class=\"kn\">from</span> <span class=\"nn\">django.db.models.functions</span> <span class=\"kn\">import</span> Lower<span class=\"p\">,</span> Upper\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyModel</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    first_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">255</span><span class=\"p\">)</span>\n    last_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">255</span><span class=\"p\">)</span>\n    height <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n    weight <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        indexes <span class=\"o\">=</span> <span class=\"p\">[</span>\n            Index<span class=\"p\">(</span>\n                Lower<span class=\"p\">(</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">),</span>\n                Upper<span class=\"p\">(</span><span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>desc<span class=\"p\">(),</span>\n                name<span class=\"o\">=</span><span class=\"s2\">&quot;first_last_name_idx&quot;</span><span class=\"p\">,</span>\n            <span class=\"p\">),</span>\n            Index<span class=\"p\">(</span>\n                F<span class=\"p\">(</span><span class=\"s2\">&quot;height&quot;</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;weight&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> Value<span class=\"p\">(</span><span class=\"mi\">5</span><span class=\"p\">)),</span>\n                name<span class=\"o\">=</span><span class=\"s2\">&quot;calc_idx&quot;</span><span class=\"p\">,</span>\n            <span class=\"p\">),</span>\n        <span class=\"p\">]</span>\n</code></pre></div>\n<p>Functional indexes are added to models using the\n<a class=\"reference internal\" href=\"/en/dev/ref/models/options/#django.db.models.Options.indexes\" title=\"django.db.models.Options.indexes\"><code class=\"xref py py-attr docutils literal notranslate\">Meta.indexes</code></a> option.</p>\n</section>\n<section id=\"pymemcache-support\">\n<h3><code class=\"docutils literal notranslate\">pymemcache</code> support<a class=\"heading-anchor\" href=\"#pymemcache-support\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The new <code class=\"docutils literal notranslate\">django.core.cache.backends.memcached.PyMemcacheCache</code> cache backend\nallows using the <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/pymemcache/\">pymemcache</a> library for memcached. <code class=\"docutils literal notranslate\">pymemcache</code> 3.4.0\nor higher is required. For more details, see the <a class=\"reference internal\" href=\"/en/dev/topics/cache/\"><span class=\"doc\">documentation on caching\nin Django</span></a>.</p>\n</section>\n<section id=\"new-decorators-for-the-admin-site\">\n<h3>New decorators for the admin site<a class=\"heading-anchor\" href=\"#new-decorators-for-the-admin-site\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The new <a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/#django.contrib.admin.display\" title=\"django.contrib.admin.display\"><code class=\"xref py py-func docutils literal notranslate\">display()</code></a> decorator allows for easily\nadding options to custom display functions that can be used with\n<a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display\" title=\"django.contrib.admin.ModelAdmin.list_display\"><code class=\"xref py py-attr docutils literal notranslate\">list_display</code></a> or\n<a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.readonly_fields\" title=\"django.contrib.admin.ModelAdmin.readonly_fields\"><code class=\"xref py py-attr docutils literal notranslate\">readonly_fields</code></a>.</p>\n<p>Likewise, the new <a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/actions/#django.contrib.admin.action\" title=\"django.contrib.admin.action\"><code class=\"xref py py-func docutils literal notranslate\">action()</code></a> decorator allows for\neasily adding options to action functions that can be used with\n<a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.actions\" title=\"django.contrib.admin.ModelAdmin.actions\"><code class=\"xref py py-attr docutils literal notranslate\">actions</code></a>.</p>\n<p>Using the <code class=\"docutils literal notranslate\">&#64;display</code> decorator has the advantage that it is now\npossible to use the <code class=\"docutils literal notranslate\">&#64;property</code> decorator when needing to specify attributes\non the custom method. Prior to this it was necessary to use the <code class=\"docutils literal notranslate\">property()</code>\nfunction instead after assigning the required attributes to the method.</p>\n<p>Using decorators has the advantage that these options are more discoverable as\nthey can be suggested by completion utilities in code editors. They are merely\na convenience and still set the same attributes on the functions under the\nhood.</p>\n</section>\n<section id=\"minor-features\">\n<h3>Minor features<a class=\"heading-anchor\" href=\"#minor-features\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"django-contrib-admin\">\n<h4><a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/#module-django.contrib.admin\" title=\"django.contrib.admin: Django's admin site.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.admin</code></a><a class=\"heading-anchor\" href=\"#django-contrib-admin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.search_fields\" title=\"django.contrib.admin.ModelAdmin.search_fields\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.search_fields</code></a> now allows searching against quoted phrases\nwith spaces.</p></li>\n<li><p>Read-only related fields are now rendered as navigable links if target models\nare registered in the admin.</p></li>\n<li><p>The admin now supports theming, and includes a dark theme that is enabled\naccording to browser settings. See <a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/#admin-theming\"><span class=\"std std-ref\">Theming support</span></a> for more details.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.autocomplete_fields\" title=\"django.contrib.admin.ModelAdmin.autocomplete_fields\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.autocomplete_fields</code></a> now respects\n<a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.ForeignKey.to_field\" title=\"django.db.models.ForeignKey.to_field\"><code class=\"xref py py-attr docutils literal notranslate\">ForeignKey.to_field</code></a> and\n<a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.ForeignKey.limit_choices_to\" title=\"django.db.models.ForeignKey.limit_choices_to\"><code class=\"xref py py-attr docutils literal notranslate\">ForeignKey.limit_choices_to</code></a> when searching a related\nmodel.</p></li>\n<li><p>The admin now installs a final catch-all view that redirects unauthenticated\nusers to the login page, regardless of whether the URL is otherwise valid.\nThis protects against a potential model enumeration privacy issue.</p>\n<p>Although not recommended, you may set the new\n<a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/#django.contrib.admin.AdminSite.final_catch_all_view\" title=\"django.contrib.admin.AdminSite.final_catch_all_view\"><code class=\"xref py py-attr docutils literal notranslate\">AdminSite.final_catch_all_view</code></a> to <code class=\"docutils literal notranslate\">False</code> to disable the\ncatch-all view.</p>\n</li>\n</ul>\n</section>\n<section id=\"django-contrib-auth\">\n<h4><a class=\"reference internal\" href=\"/en/dev/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.auth</code></a><a class=\"heading-anchor\" href=\"#django-contrib-auth\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul>\n<li><p>The default iteration count for the PBKDF2 password hasher is increased from\n216,000 to 260,000.</p></li>\n<li><p>The default variant for the Argon2 password hasher is changed to Argon2id.\n<code class=\"docutils literal notranslate\">memory_cost</code> and <code class=\"docutils literal notranslate\">parallelism</code> are increased to 102,400 and 8\nrespectively to match the <code class=\"docutils literal notranslate\">argon2-cffi</code> defaults.</p>\n<p>Increasing the <code class=\"docutils literal notranslate\">memory_cost</code> pushes the required memory from 512 KB to 100\nMB. This is still rather conservative but can lead to problems in memory\nconstrained environments. If this is the case, the existing hasher can be\nsubclassed to override the defaults.</p>\n</li>\n<li><p>The default salt entropy for the Argon2, MD5, PBKDF2, SHA-1 password hashers\nis increased from 71 to 128 bits.</p></li>\n</ul>\n</section>\n<section id=\"django-contrib-contenttypes\">\n<h4><a class=\"reference internal\" href=\"/en/dev/ref/contrib/contenttypes/#module-django.contrib.contenttypes\" title=\"django.contrib.contenttypes: Provides generic interface to installed models.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.contenttypes</code></a><a class=\"heading-anchor\" href=\"#django-contrib-contenttypes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>The new <code class=\"docutils literal notranslate\">absolute_max</code> argument for\n<a class=\"reference internal\" href=\"/en/dev/ref/contrib/contenttypes/#django.contrib.contenttypes.forms.generic_inlineformset_factory\" title=\"django.contrib.contenttypes.forms.generic_inlineformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">generic_inlineformset_factory()</code></a>\nallows customizing the maximum number of forms that can be instantiated when\nsupplying <code class=\"docutils literal notranslate\">POST</code> data. See <a class=\"reference internal\" href=\"/en/dev/topics/forms/formsets/#formsets-absolute-max\"><span class=\"std std-ref\">Limiting the maximum number of instantiated forms</span></a> for more details.</p></li>\n<li><p>The new <code class=\"docutils literal notranslate\">can_delete_extra</code> argument for\n<a class=\"reference internal\" href=\"/en/dev/ref/contrib/contenttypes/#django.contrib.contenttypes.forms.generic_inlineformset_factory\" title=\"django.contrib.contenttypes.forms.generic_inlineformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">generic_inlineformset_factory()</code></a>\nallows removal of the option to delete extra forms. See\n<a class=\"reference internal\" href=\"/en/dev/topics/forms/formsets/#django.forms.formsets.BaseFormSet.can_delete_extra\" title=\"django.forms.formsets.BaseFormSet.can_delete_extra\"><code class=\"xref py py-attr docutils literal notranslate\">can_delete_extra</code></a> for more information.</p></li>\n</ul>\n</section>\n<section id=\"django-contrib-gis\">\n<h4><a class=\"reference internal\" href=\"/en/dev/ref/contrib/gis/#module-django.contrib.gis\" title=\"django.contrib.gis: Geographic Information System (GIS) extensions for Django\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.gis</code></a><a class=\"heading-anchor\" href=\"#django-contrib-gis\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>The <a class=\"reference internal\" href=\"/en/dev/ref/contrib/gis/gdal/#django.contrib.gis.gdal.GDALRaster.transform\" title=\"django.contrib.gis.gdal.GDALRaster.transform\"><code class=\"xref py py-meth docutils literal notranslate\">GDALRaster.transform()</code></a> method now supports\n<a class=\"reference internal\" href=\"/en/dev/ref/contrib/gis/gdal/#django.contrib.gis.gdal.SpatialReference\" title=\"django.contrib.gis.gdal.SpatialReference\"><code class=\"xref py py-class docutils literal notranslate\">SpatialReference</code></a>.</p></li>\n<li><p>The <a class=\"reference internal\" href=\"/en/dev/ref/contrib/gis/gdal/#django.contrib.gis.gdal.DataSource\" title=\"django.contrib.gis.gdal.DataSource\"><code class=\"xref py py-class docutils literal notranslate\">DataSource</code></a> class now supports\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/pathlib.html#pathlib.Path\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">pathlib.Path</code></a>.</p></li>\n<li><p>The <a class=\"reference internal\" href=\"/en/dev/ref/contrib/gis/layermapping/#django.contrib.gis.utils.LayerMapping\" title=\"django.contrib.gis.utils.LayerMapping\"><code class=\"xref py py-class docutils literal notranslate\">LayerMapping</code></a> class now supports\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/pathlib.html#pathlib.Path\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">pathlib.Path</code></a>.</p></li>\n</ul>\n</section>\n<section id=\"django-contrib-postgres\">\n<h4><a class=\"reference internal\" href=\"/en/dev/ref/contrib/postgres/#module-django.contrib.postgres\" title=\"django.contrib.postgres: PostgreSQL-specific fields and features\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.postgres</code></a><a class=\"heading-anchor\" href=\"#django-contrib-postgres\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/ref/contrib/postgres/constraints/#django.contrib.postgres.constraints.ExclusionConstraint.include\" title=\"django.contrib.postgres.constraints.ExclusionConstraint.include\"><code class=\"xref py py-attr docutils literal notranslate\">ExclusionConstraint.include</code></a> attribute allows creating\ncovering exclusion constraints on PostgreSQL 12+.</p></li>\n<li><p>The new <code class=\"docutils literal notranslate\">ExclusionConstraint.opclasses</code> attribute allows setting PostgreSQL\noperator classes.</p></li>\n<li><p>The new <code class=\"docutils literal notranslate\">JSONBAgg.ordering</code> attribute determines the ordering of the\naggregated elements.</p></li>\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/ref/contrib/postgres/aggregates/#django.contrib.postgres.aggregates.JSONBAgg.distinct\" title=\"django.contrib.postgres.aggregates.JSONBAgg.distinct\"><code class=\"xref py py-attr docutils literal notranslate\">JSONBAgg.distinct</code></a> attribute determines if aggregated values\nwill be distinct.</p></li>\n<li><p>The <a class=\"reference internal\" href=\"/en/dev/ref/contrib/postgres/operations/#django.contrib.postgres.operations.CreateExtension\" title=\"django.contrib.postgres.operations.CreateExtension\"><code class=\"xref py py-class docutils literal notranslate\">CreateExtension</code></a> operation\nnow checks that the extension already exists in the database and skips the\nmigration if so.</p></li>\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/ref/contrib/postgres/operations/#django.contrib.postgres.operations.CreateCollation\" title=\"django.contrib.postgres.operations.CreateCollation\"><code class=\"xref py py-class docutils literal notranslate\">CreateCollation</code></a> and\n<a class=\"reference internal\" href=\"/en/dev/ref/contrib/postgres/operations/#django.contrib.postgres.operations.RemoveCollation\" title=\"django.contrib.postgres.operations.RemoveCollation\"><code class=\"xref py py-class docutils literal notranslate\">RemoveCollation</code></a> operations\nallow creating and dropping collations on PostgreSQL. See\n<a class=\"reference internal\" href=\"/en/dev/ref/contrib/postgres/operations/#manage-postgresql-collations\"><span class=\"std std-ref\">Managing collations using migrations</span></a> for more details.</p></li>\n<li><p>Lookups for <a class=\"reference internal\" href=\"/en/dev/ref/contrib/postgres/fields/#django.contrib.postgres.fields.ArrayField\" title=\"django.contrib.postgres.fields.ArrayField\"><code class=\"xref py py-class docutils literal notranslate\">ArrayField</code></a> now allow\n(non-nested) arrays containing expressions as right-hand sides.</p></li>\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/ref/contrib/postgres/indexes/#django.contrib.postgres.indexes.OpClass\" title=\"django.contrib.postgres.indexes.OpClass\"><code class=\"xref py py-class docutils literal notranslate\">OpClass()</code></a>\nexpression allows creating functional indexes on expressions with a custom\noperator class. See <a class=\"reference internal\" href=\"#new-functional-indexes\"><span class=\"std std-ref\">Functional indexes</span></a> for more details.</p></li>\n</ul>\n</section>\n<section id=\"django-contrib-sitemaps\">\n<h4><a class=\"reference internal\" href=\"/en/dev/ref/contrib/sitemaps/#module-django.contrib.sitemaps\" title=\"django.contrib.sitemaps: A framework for generating Google sitemap XML files.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.sitemaps</code></a><a class=\"heading-anchor\" href=\"#django-contrib-sitemaps\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/ref/contrib/sitemaps/#django.contrib.sitemaps.Sitemap\" title=\"django.contrib.sitemaps.Sitemap\"><code class=\"xref py py-class docutils literal notranslate\">Sitemap</code></a> attributes\n<a class=\"reference internal\" href=\"/en/dev/ref/contrib/sitemaps/#django.contrib.sitemaps.Sitemap.alternates\" title=\"django.contrib.sitemaps.Sitemap.alternates\"><code class=\"xref py py-attr docutils literal notranslate\">alternates</code></a>,\n<a class=\"reference internal\" href=\"/en/dev/ref/contrib/sitemaps/#django.contrib.sitemaps.Sitemap.languages\" title=\"django.contrib.sitemaps.Sitemap.languages\"><code class=\"xref py py-attr docutils literal notranslate\">languages</code></a> and\n<a class=\"reference internal\" href=\"/en/dev/ref/contrib/sitemaps/#django.contrib.sitemaps.Sitemap.x_default\" title=\"django.contrib.sitemaps.Sitemap.x_default\"><code class=\"xref py py-attr docutils literal notranslate\">x_default</code></a> allow\ngenerating sitemap <em>alternates</em> to localized versions of your pages.</p></li>\n</ul>\n</section>\n<section id=\"django-contrib-syndication\">\n<h4><a class=\"reference internal\" href=\"/en/dev/ref/contrib/syndication/#module-django.contrib.syndication\" title=\"django.contrib.syndication: A framework for generating syndication feeds, in RSS and Atom, quite easily.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.syndication</code></a><a class=\"heading-anchor\" href=\"#django-contrib-syndication\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>The new <code class=\"docutils literal notranslate\">item_comments</code> hook allows specifying a comments URL per feed\nitem.</p></li>\n</ul>\n</section>\n<section id=\"database-backends\">\n<h4>Database backends<a class=\"heading-anchor\" href=\"#database-backends\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>Third-party database backends can now skip or mark as expected failures\ntests in Django’s test suite using the new\n<code class=\"docutils literal notranslate\">DatabaseFeatures.django_test_skips</code> and\n<code class=\"docutils literal notranslate\">django_test_expected_failures</code> attributes.</p></li>\n</ul>\n</section>\n<section id=\"decorators\">\n<h4>Decorators<a class=\"heading-anchor\" href=\"#decorators\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/topics/http/decorators/#django.views.decorators.common.no_append_slash\" title=\"django.views.decorators.common.no_append_slash\"><code class=\"xref py py-func docutils literal notranslate\">no_append_slash()</code></a> decorator\nallows individual views to be excluded from <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-APPEND_SLASH\"><code class=\"xref std std-setting docutils literal notranslate\">APPEND_SLASH</code></a> URL\nnormalization.</p></li>\n</ul>\n</section>\n<section id=\"error-reporting\">\n<h4>Error Reporting<a class=\"heading-anchor\" href=\"#error-reporting\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>Custom <a class=\"reference internal\" href=\"/en/dev/howto/error-reporting/#django.views.debug.ExceptionReporter\" title=\"django.views.debug.ExceptionReporter\"><code class=\"xref py py-class docutils literal notranslate\">ExceptionReporter</code></a> subclasses can now\ndefine the <a class=\"reference internal\" href=\"/en/dev/howto/error-reporting/#django.views.debug.ExceptionReporter.html_template_path\" title=\"django.views.debug.ExceptionReporter.html_template_path\"><code class=\"xref py py-attr docutils literal notranslate\">html_template_path</code></a>\nand <a class=\"reference internal\" href=\"/en/dev/howto/error-reporting/#django.views.debug.ExceptionReporter.text_template_path\" title=\"django.views.debug.ExceptionReporter.text_template_path\"><code class=\"xref py py-attr docutils literal notranslate\">text_template_path</code></a>\nproperties to override the templates used to render exception reports.</p></li>\n</ul>\n</section>\n<section id=\"file-uploads\">\n<h4>File Uploads<a class=\"heading-anchor\" href=\"#file-uploads\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/ref/files/uploads/#django.core.files.uploadhandler.FileUploadHandler.upload_interrupted\" title=\"django.core.files.uploadhandler.FileUploadHandler.upload_interrupted\"><code class=\"xref py py-meth docutils literal notranslate\">FileUploadHandler.upload_interrupted()</code></a>\ncallback allows handling interrupted uploads.</p></li>\n</ul>\n</section>\n<section id=\"forms\">\n<h4>Forms<a class=\"heading-anchor\" href=\"#forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>The new <code class=\"docutils literal notranslate\">absolute_max</code> argument for <a class=\"reference internal\" href=\"/en/dev/ref/forms/formsets/#django.forms.formsets.formset_factory\" title=\"django.forms.formsets.formset_factory\"><code class=\"xref py py-func docutils literal notranslate\">formset_factory()</code></a>,\n<a class=\"reference internal\" href=\"/en/dev/ref/forms/models/#django.forms.models.inlineformset_factory\" title=\"django.forms.models.inlineformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">inlineformset_factory()</code></a>, and <a class=\"reference internal\" href=\"/en/dev/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">modelformset_factory()</code></a> allows\ncustomizing the maximum number of forms that can be instantiated when\nsupplying <code class=\"docutils literal notranslate\">POST</code> data. See <a class=\"reference internal\" href=\"/en/dev/topics/forms/formsets/#formsets-absolute-max\"><span class=\"std std-ref\">Limiting the maximum number of instantiated forms</span></a> for more details.</p></li>\n<li><p>The new <code class=\"docutils literal notranslate\">can_delete_extra</code> argument for <a class=\"reference internal\" href=\"/en/dev/ref/forms/formsets/#django.forms.formsets.formset_factory\" title=\"django.forms.formsets.formset_factory\"><code class=\"xref py py-func docutils literal notranslate\">formset_factory()</code></a>,\n<a class=\"reference internal\" href=\"/en/dev/ref/forms/models/#django.forms.models.inlineformset_factory\" title=\"django.forms.models.inlineformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">inlineformset_factory()</code></a>, and <a class=\"reference internal\" href=\"/en/dev/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">modelformset_factory()</code></a> allows\nremoval of the option to delete extra forms. See\n<a class=\"reference internal\" href=\"/en/dev/topics/forms/formsets/#django.forms.formsets.BaseFormSet.can_delete_extra\" title=\"django.forms.formsets.BaseFormSet.can_delete_extra\"><code class=\"xref py py-attr docutils literal notranslate\">can_delete_extra</code></a> for more information.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/topics/forms/formsets/#django.forms.formsets.BaseFormSet\" title=\"django.forms.formsets.BaseFormSet\"><code class=\"xref py py-class docutils literal notranslate\">BaseFormSet</code></a> now reports a user facing error,\nrather than raising an exception, when the management form is missing or has\nbeen tampered with. To customize this error message, pass the\n<code class=\"docutils literal notranslate\">error_messages</code> argument with the key <code class=\"docutils literal notranslate\">'missing_management_form'</code> when\ninstantiating the formset.</p></li>\n</ul>\n</section>\n<section id=\"generic-views\">\n<h4>Generic Views<a class=\"heading-anchor\" href=\"#generic-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>The <code class=\"docutils literal notranslate\">week_format</code> attributes of\n<a class=\"reference internal\" href=\"/en/dev/ref/class-based-views/mixins-date-based/#django.views.generic.dates.WeekMixin\" title=\"django.views.generic.dates.WeekMixin\"><code class=\"xref py py-class docutils literal notranslate\">WeekMixin</code></a> and\n<a class=\"reference internal\" href=\"/en/dev/ref/class-based-views/generic-date-based/#django.views.generic.dates.WeekArchiveView\" title=\"django.views.generic.dates.WeekArchiveView\"><code class=\"xref py py-class docutils literal notranslate\">WeekArchiveView</code></a> now support the\n<code class=\"docutils literal notranslate\">'%V'</code> ISO 8601 week format.</p></li>\n</ul>\n</section>\n<section id=\"management-commands\">\n<h4>Management Commands<a class=\"heading-anchor\" href=\"#management-commands\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/django-admin/#django-admin-loaddata\"><code class=\"xref std std-djadmin docutils literal notranslate\">loaddata</code></a> now supports fixtures stored in XZ archives (<code class=\"docutils literal notranslate\">.xz</code>) and\nLZMA archives (<code class=\"docutils literal notranslate\">.lzma</code>).</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/django-admin/#django-admin-dumpdata\"><code class=\"xref std std-djadmin docutils literal notranslate\">dumpdata</code></a> now can compress data in the <code class=\"docutils literal notranslate\">bz2</code>, <code class=\"docutils literal notranslate\">gz</code>, <code class=\"docutils literal notranslate\">lzma</code>,\nor <code class=\"docutils literal notranslate\">xz</code> formats.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemigrations</code></a> can now be called without an active database\nconnection. In that case, check for a consistent migration history is\nskipped.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/howto/custom-management-commands/#django.core.management.BaseCommand.requires_system_checks\" title=\"django.core.management.BaseCommand.requires_system_checks\"><code class=\"xref py py-attr docutils literal notranslate\">BaseCommand.requires_system_checks</code></a> now supports specifying a list of\ntags. System checks registered in the chosen tags will be checked for errors\nprior to executing the command. In previous versions, either all or none\nof the system checks were performed.</p></li>\n<li><p>Support for colored terminal output on Windows is updated. Various modern\nterminal environments are automatically detected, and the options for\nenabling support in other cases are improved. See <a class=\"reference internal\" href=\"/en/dev/ref/django-admin/#syntax-coloring\"><span class=\"std std-ref\">Syntax coloring</span></a> for\nmore details.</p></li>\n</ul>\n</section>\n<section id=\"migrations\">\n<h4>Migrations<a class=\"heading-anchor\" href=\"#migrations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>The new <code class=\"docutils literal notranslate\">Operation.migration_name_fragment</code> property allows providing a\nfilename fragment that will be used to name a migration containing only that\noperation.</p></li>\n<li><p>Migrations now support serialization of pure and concrete path objects from\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/pathlib.html#module-pathlib\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\">pathlib</code></a>, and <a class=\"reference external\" href=\"https://docs.python.org/3/library/os.html#os.PathLike\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">os.PathLike</code></a> instances.</p></li>\n</ul>\n</section>\n<section id=\"models\">\n<h4>Models<a class=\"heading-anchor\" href=\"#models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>The new <code class=\"docutils literal notranslate\">no_key</code> parameter for <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.select_for_update\" title=\"django.db.models.query.QuerySet.select_for_update\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.select_for_update()</code></a>,\nsupported on PostgreSQL, allows acquiring weaker locks that don’t block the\ncreation of rows that reference locked rows through a foreign key.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/models/conditional-expressions/#django.db.models.expressions.When\" title=\"django.db.models.expressions.When\"><code class=\"xref py py-class docutils literal notranslate\">When()</code></a> expression now allows\nusing the <code class=\"docutils literal notranslate\">condition</code> argument with <code class=\"docutils literal notranslate\">lookups</code>.</p></li>\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/ref/models/indexes/#django.db.models.Index.include\" title=\"django.db.models.Index.include\"><code class=\"xref py py-attr docutils literal notranslate\">Index.include</code></a> and <a class=\"reference internal\" href=\"/en/dev/ref/models/constraints/#django.db.models.UniqueConstraint.include\" title=\"django.db.models.UniqueConstraint.include\"><code class=\"xref py py-attr docutils literal notranslate\">UniqueConstraint.include</code></a>\nattributes allow creating covering indexes and covering unique constraints on\nPostgreSQL 11+.</p></li>\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/ref/models/constraints/#django.db.models.UniqueConstraint.opclasses\" title=\"django.db.models.UniqueConstraint.opclasses\"><code class=\"xref py py-attr docutils literal notranslate\">UniqueConstraint.opclasses</code></a> attribute allows setting\nPostgreSQL operator classes.</p></li>\n<li><p>The <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.update\" title=\"django.db.models.query.QuerySet.update\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.update()</code></a> method now respects the <code class=\"docutils literal notranslate\">order_by()</code> clause on\nMySQL and MariaDB.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.FilteredRelation\" title=\"django.db.models.FilteredRelation\"><code class=\"xref py py-class docutils literal notranslate\">FilteredRelation()</code></a> now supports\nnested relations.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">of</code> argument of <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.select_for_update\" title=\"django.db.models.query.QuerySet.select_for_update\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.select_for_update()</code></a> is now allowed\non MySQL 8.0.1+.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/models/expressions/#django.db.models.Value\" title=\"django.db.models.Value\"><code class=\"xref py py-class docutils literal notranslate\">Value()</code></a> expression now\nautomatically resolves its <code class=\"docutils literal notranslate\">output_field</code> to the appropriate\n<a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> subclass based on the type of\nits provided <code class=\"docutils literal notranslate\">value</code> for <a class=\"reference external\" href=\"https://docs.python.org/3/library/functions.html#bool\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">bool</code></a>, <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#bytes\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">bytes</code></a>,\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/functions.html#float\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">float</code></a>, <a class=\"reference external\" href=\"https://docs.python.org/3/library/functions.html#int\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">int</code></a>, <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">str</code></a>,\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.date\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">datetime.date</code></a>, <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">datetime.datetime</code></a>,\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.time\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">datetime.time</code></a>, <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.timedelta\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">datetime.timedelta</code></a>,\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/decimal.html#decimal.Decimal\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">decimal.Decimal</code></a>, and <a class=\"reference external\" href=\"https://docs.python.org/3/library/uuid.html#uuid.UUID\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">uuid.UUID</code></a> instances. As a\nconsequence, resolving an <code class=\"docutils literal notranslate\">output_field</code> for database functions and\ncombined expressions may now crash with mixed types when using <code class=\"docutils literal notranslate\">Value()</code>.\nYou will need to explicitly set the <code class=\"docutils literal notranslate\">output_field</code> in such cases.</p></li>\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.alias\" title=\"django.db.models.query.QuerySet.alias\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.alias()</code></a> method allows creating reusable aliases for\nexpressions that don’t need to be selected but are used for filtering,\nordering, or as a part of complex expressions.</p></li>\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/ref/models/database-functions/#django.db.models.functions.Collate\" title=\"django.db.models.functions.Collate\"><code class=\"xref py py-class docutils literal notranslate\">Collate</code></a> function allows\nfiltering and ordering by specified database collations.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">field_name</code> argument of <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.in_bulk\" title=\"django.db.models.query.QuerySet.in_bulk\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.in_bulk()</code></a> now accepts\ndistinct fields if there’s only one field specified in\n<a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct\" title=\"django.db.models.query.QuerySet.distinct\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.distinct()</code></a>.</p></li>\n<li><p>The new <code class=\"docutils literal notranslate\">tzinfo</code> parameter of the\n<a class=\"reference internal\" href=\"/en/dev/ref/models/database-functions/#django.db.models.functions.TruncDate\" title=\"django.db.models.functions.TruncDate\"><code class=\"xref py py-class docutils literal notranslate\">TruncDate</code></a> and\n<a class=\"reference internal\" href=\"/en/dev/ref/models/database-functions/#django.db.models.functions.TruncTime\" title=\"django.db.models.functions.TruncTime\"><code class=\"xref py py-class docutils literal notranslate\">TruncTime</code></a> database functions allows\ntruncating datetimes in a specific timezone.</p></li>\n<li><p>The new <code class=\"docutils literal notranslate\">db_collation</code> argument for\n<a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.CharField.db_collation\" title=\"django.db.models.CharField.db_collation\"><code class=\"xref py py-attr docutils literal notranslate\">CharField</code></a> and\n<a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.TextField.db_collation\" title=\"django.db.models.TextField.db_collation\"><code class=\"xref py py-attr docutils literal notranslate\">TextField</code></a> allows setting a\ndatabase collation for the field.</p></li>\n<li><p>Added the <a class=\"reference internal\" href=\"/en/dev/ref/models/database-functions/#django.db.models.functions.Random\" title=\"django.db.models.functions.Random\"><code class=\"xref py py-class docutils literal notranslate\">Random</code></a> database function.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#aggregation-functions\"><span class=\"std std-ref\">Aggregation functions</span></a>, <a class=\"reference internal\" href=\"/en/dev/ref/models/expressions/#django.db.models.F\" title=\"django.db.models.F\"><code class=\"xref py py-class docutils literal notranslate\">F()</code></a>,\n<a class=\"reference internal\" href=\"/en/dev/ref/models/expressions/#django.db.models.OuterRef\" title=\"django.db.models.OuterRef\"><code class=\"xref py py-class docutils literal notranslate\">OuterRef()</code></a>, and other expressions now\nallow using transforms. See <a class=\"reference internal\" href=\"/en/dev/topics/db/queries/#using-transforms-in-expressions\"><span class=\"std std-ref\">Expressions can reference transforms</span></a> for\ndetails.</p></li>\n<li><p>The new <code class=\"docutils literal notranslate\">durable</code> argument for <a class=\"reference internal\" href=\"/en/dev/topics/db/transactions/#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a>\nguarantees that changes made in the atomic block will be committed if the\nblock exits without errors. A nested atomic block marked as durable will\nraise a <code class=\"docutils literal notranslate\">RuntimeError</code>.</p></li>\n<li><p>Added the <a class=\"reference internal\" href=\"/en/dev/ref/models/database-functions/#django.db.models.functions.JSONObject\" title=\"django.db.models.functions.JSONObject\"><code class=\"xref py py-class docutils literal notranslate\">JSONObject</code></a> database function.</p></li>\n</ul>\n</section>\n<section id=\"pagination\">\n<h4>Pagination<a class=\"heading-anchor\" href=\"#pagination\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/ref/paginator/#django.core.paginator.Paginator.get_elided_page_range\" title=\"django.core.paginator.Paginator.get_elided_page_range\"><code class=\"xref py py-meth docutils literal notranslate\">django.core.paginator.Paginator.get_elided_page_range()</code></a> method\nallows generating a page range with some of the values elided. If there are a\nlarge number of pages, this can be helpful for generating a reasonable number\nof page links in a template.</p></li>\n</ul>\n</section>\n<section id=\"requests-and-responses\">\n<h4>Requests and Responses<a class=\"heading-anchor\" href=\"#requests-and-responses\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>Response headers are now stored in <a class=\"reference internal\" href=\"/en/dev/ref/request-response/#django.http.HttpResponse.headers\" title=\"django.http.HttpResponse.headers\"><code class=\"xref py py-attr docutils literal notranslate\">HttpResponse.headers</code></a>. This can be\nused instead of the original dict-like interface of <code class=\"docutils literal notranslate\">HttpResponse</code> objects.\nBoth interfaces will continue to be supported. See\n<a class=\"reference internal\" href=\"/en/dev/ref/request-response/#setting-header-fields\"><span class=\"std std-ref\">Setting header fields</span></a> for details.</p></li>\n<li><p>The new <code class=\"docutils literal notranslate\">headers</code> parameter of <a class=\"reference internal\" href=\"/en/dev/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\">HttpResponse</code></a>,\n<a class=\"reference internal\" href=\"/en/dev/ref/template-response/#django.template.response.SimpleTemplateResponse\" title=\"django.template.response.SimpleTemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\">SimpleTemplateResponse</code></a>, and\n<a class=\"reference internal\" href=\"/en/dev/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\">TemplateResponse</code></a> allows setting response\n<a class=\"reference internal\" href=\"/en/dev/ref/request-response/#django.http.HttpResponse.headers\" title=\"django.http.HttpResponse.headers\"><code class=\"xref py py-attr docutils literal notranslate\">headers</code></a> on instantiation.</p></li>\n</ul>\n</section>\n<section id=\"security\">\n<h4>Security<a class=\"heading-anchor\" href=\"#security\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul>\n<li><p>The <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\">SECRET_KEY</code></a> setting is now checked for a valid value upon first\naccess, rather than when settings are first loaded. This enables running\nmanagement commands that do not rely on the <code class=\"docutils literal notranslate\">SECRET_KEY</code> without needing to\nprovide a value. As a consequence of this, calling\n<a class=\"reference internal\" href=\"/en/dev/topics/settings/#django.conf.settings.configure\" title=\"django.conf.settings.configure\"><code class=\"xref py py-func docutils literal notranslate\">configure()</code></a> without providing a valid\n<code class=\"docutils literal notranslate\">SECRET_KEY</code>, and then going on to access <code class=\"docutils literal notranslate\">settings.SECRET_KEY</code> will now\nraise an <a class=\"reference internal\" href=\"/en/dev/ref/exceptions/#django.core.exceptions.ImproperlyConfigured\" title=\"django.core.exceptions.ImproperlyConfigured\"><code class=\"xref py py-exc docutils literal notranslate\">ImproperlyConfigured</code></a> exception.</p></li>\n<li><p>The new <code class=\"docutils literal notranslate\">Signer.sign_object()</code> and <code class=\"docutils literal notranslate\">Signer.unsign_object()</code> methods allow\nsigning complex data structures. See <a class=\"reference internal\" href=\"/en/dev/topics/signing/#signing-complex-data\"><span class=\"std std-ref\">Protecting complex data structures</span></a> for more\ndetails.</p>\n<p>Also, <a class=\"reference internal\" href=\"/en/dev/topics/signing/#django.core.signing.dumps\" title=\"django.core.signing.dumps\"><code class=\"xref py py-func docutils literal notranslate\">signing.dumps()</code></a> and\n<a class=\"reference internal\" href=\"/en/dev/topics/signing/#django.core.signing.loads\" title=\"django.core.signing.loads\"><code class=\"xref py py-func docutils literal notranslate\">loads()</code></a> become shortcuts for\n<a class=\"reference internal\" href=\"/en/dev/topics/signing/#django.core.signing.TimestampSigner.sign_object\" title=\"django.core.signing.TimestampSigner.sign_object\"><code class=\"xref py py-meth docutils literal notranslate\">TimestampSigner.sign_object()</code></a> and\n<a class=\"reference internal\" href=\"/en/dev/topics/signing/#django.core.signing.TimestampSigner.unsign_object\" title=\"django.core.signing.TimestampSigner.unsign_object\"><code class=\"xref py py-meth docutils literal notranslate\">unsign_object()</code></a>.</p>\n</li>\n</ul>\n</section>\n<section id=\"serialization\">\n<h4>Serialization<a class=\"heading-anchor\" href=\"#serialization\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/topics/serialization/#serialization-formats-jsonl\"><span class=\"std std-ref\">JSONL</span></a> serializer allows using\nthe JSON Lines format with <a class=\"reference internal\" href=\"/en/dev/ref/django-admin/#django-admin-dumpdata\"><code class=\"xref std std-djadmin docutils literal notranslate\">dumpdata</code></a> and <a class=\"reference internal\" href=\"/en/dev/ref/django-admin/#django-admin-loaddata\"><code class=\"xref std std-djadmin docutils literal notranslate\">loaddata</code></a>. This\ncan be useful for populating large databases because data is loaded line by\nline into memory, rather than being loaded all at once.</p></li>\n</ul>\n</section>\n<section id=\"signals\">\n<h4>Signals<a class=\"heading-anchor\" href=\"#signals\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/en/dev/topics/signals/#django.dispatch.Signal.send_robust\" title=\"django.dispatch.Signal.send_robust\"><code class=\"xref py py-meth docutils literal notranslate\">Signal.send_robust()</code></a> now logs\nexceptions.</p></li>\n</ul>\n</section>\n<section id=\"templates\">\n<h4>Templates<a class=\"heading-anchor\" href=\"#templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/templates/builtins/#std-templatefilter-floatformat\"><code class=\"xref std std-tfilter docutils literal notranslate\">floatformat</code></a> template filter now allows using the <code class=\"docutils literal notranslate\">g</code> suffix to\nforce grouping by the <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-THOUSAND_SEPARATOR\"><code class=\"xref std std-setting docutils literal notranslate\">THOUSAND_SEPARATOR</code></a> for the active locale.</p></li>\n<li><p>Templates cached with <a class=\"reference internal\" href=\"/en/dev/ref/templates/api/#template-loaders\"><span class=\"std std-ref\">Cached template loaders</span></a> are\nnow correctly reloaded in development.</p></li>\n</ul>\n</section>\n<section id=\"tests\">\n<h4>Tests<a class=\"heading-anchor\" href=\"#tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>Objects assigned to class attributes in <a class=\"reference internal\" href=\"/en/dev/topics/testing/tools/#django.test.TestCase.setUpTestData\" title=\"django.test.TestCase.setUpTestData\"><code class=\"xref py py-meth docutils literal notranslate\">TestCase.setUpTestData()</code></a> are\nnow isolated for each test method. Such objects are now required to support\ncreating deep copies with <a class=\"reference external\" href=\"https://docs.python.org/3/library/copy.html#copy.deepcopy\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\">copy.deepcopy()</code></a>. Assigning objects which\ndon’t support <code class=\"docutils literal notranslate\">deepcopy()</code> is deprecated and will be removed in Django 4.1.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/topics/testing/advanced/#django.test.runner.DiscoverRunner\" title=\"django.test.runner.DiscoverRunner\"><code class=\"xref py py-class docutils literal notranslate\">DiscoverRunner</code></a> now enables\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/faulthandler.html#module-faulthandler\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\">faulthandler</code></a> by default. This can be disabled by using the\n<a class=\"reference internal\" href=\"/en/dev/ref/django-admin/#cmdoption-test-no-faulthandler\"><code class=\"xref std std-option docutils literal notranslate\">test --no-faulthandler</code></a> option.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/topics/testing/advanced/#django.test.runner.DiscoverRunner\" title=\"django.test.runner.DiscoverRunner\"><code class=\"xref py py-class docutils literal notranslate\">DiscoverRunner</code></a> and the\n<a class=\"reference internal\" href=\"/en/dev/ref/django-admin/#django-admin-test\"><code class=\"xref std std-djadmin docutils literal notranslate\">test</code></a> management command can now track timings, including database\nsetup and total run time. This can be enabled by using the <a class=\"reference internal\" href=\"/en/dev/ref/django-admin/#cmdoption-test-timing\"><code class=\"xref std std-option docutils literal notranslate\">test\n--timing</code></a> option.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/topics/testing/tools/#django.test.Client\" title=\"django.test.Client\"><code class=\"xref py py-class docutils literal notranslate\">Client</code></a> now preserves the request query string when\nfollowing 307 and 308 redirects.</p></li>\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/topics/testing/tools/#django.test.TestCase.captureOnCommitCallbacks\" title=\"django.test.TestCase.captureOnCommitCallbacks\"><code class=\"xref py py-meth docutils literal notranslate\">TestCase.captureOnCommitCallbacks()</code></a> method captures callback\nfunctions passed to <a class=\"reference internal\" href=\"/en/dev/topics/db/transactions/#django.db.transaction.on_commit\" title=\"django.db.transaction.on_commit\"><code class=\"xref py py-func docutils literal notranslate\">transaction.on_commit()</code></a> in a list. This allows you to test such\ncallbacks without using the slower <a class=\"reference internal\" href=\"/en/dev/topics/testing/tools/#django.test.TransactionTestCase\" title=\"django.test.TransactionTestCase\"><code class=\"xref py py-class docutils literal notranslate\">TransactionTestCase</code></a>.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/topics/testing/tools/#django.test.TransactionTestCase.assertQuerySetEqual\" title=\"django.test.TransactionTestCase.assertQuerySetEqual\"><code class=\"xref py py-meth docutils literal notranslate\">TransactionTestCase.assertQuerysetEqual()</code></a> now supports direct\ncomparison against another queryset rather than being restricted to\ncomparison against a list of string representations of objects when using the\ndefault value for the <code class=\"docutils literal notranslate\">transform</code> argument.</p></li>\n</ul>\n</section>\n<section id=\"utilities\">\n<h4>Utilities<a class=\"heading-anchor\" href=\"#utilities\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>The new <code class=\"docutils literal notranslate\">depth</code> parameter of <code class=\"docutils literal notranslate\">django.utils.timesince.timesince()</code> and\n<code class=\"docutils literal notranslate\">django.utils.timesince.timeuntil()</code> functions allows specifying the number\nof adjacent time units to return.</p></li>\n</ul>\n</section>\n<section id=\"validators\">\n<h4>Validators<a class=\"heading-anchor\" href=\"#validators\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>Built-in validators now include the provided value in the <code class=\"docutils literal notranslate\">params</code> argument\nof a raised <a class=\"reference internal\" href=\"/en/dev/ref/exceptions/#django.core.exceptions.ValidationError\" title=\"django.core.exceptions.ValidationError\"><code class=\"xref py py-exc docutils literal notranslate\">ValidationError</code></a>. This allows\ncustom error messages to use the <code class=\"docutils literal notranslate\">%(value)s</code> placeholder.</p></li>\n<li><p>The <a class=\"reference internal\" href=\"/en/dev/ref/exceptions/#django.core.exceptions.ValidationError\" title=\"django.core.exceptions.ValidationError\"><code class=\"xref py py-class docutils literal notranslate\">ValidationError</code></a> equality operator now ignores <code class=\"docutils literal notranslate\">messages</code> and\n<code class=\"docutils literal notranslate\">params</code> ordering.</p></li>\n</ul>\n</section>\n</section>\n</section>\n<section id=\"backwards-incompatible-changes-in-3-2\">\n<span id=\"backwards-incompatible-3-2\"></span><h2>Backwards incompatible changes in 3.2<a class=\"heading-anchor\" href=\"#backwards-incompatible-changes-in-3-2\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"database-backend-api\">\n<h3>Database backend API<a class=\"heading-anchor\" href=\"#database-backend-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>This section describes changes that may be needed in third-party database\nbackends.</p>\n<ul class=\"simple\">\n<li><p>The new <code class=\"docutils literal notranslate\">DatabaseFeatures.introspected_field_types</code> property replaces these\nfeatures:</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\">can_introspect_autofield</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">can_introspect_big_integer_field</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">can_introspect_binary_field</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">can_introspect_decimal_field</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">can_introspect_duration_field</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">can_introspect_ip_address_field</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">can_introspect_positive_integer_field</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">can_introspect_small_integer_field</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">can_introspect_time_field</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">introspected_big_auto_field_type</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">introspected_small_auto_field_type</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">introspected_boolean_field_type</code></p></li>\n</ul>\n</li>\n<li><p>To enable support for covering indexes (<a class=\"reference internal\" href=\"/en/dev/ref/models/indexes/#django.db.models.Index.include\" title=\"django.db.models.Index.include\"><code class=\"xref py py-attr docutils literal notranslate\">Index.include</code></a>) and covering\nunique constraints (<a class=\"reference internal\" href=\"/en/dev/ref/models/constraints/#django.db.models.UniqueConstraint.include\" title=\"django.db.models.UniqueConstraint.include\"><code class=\"xref py py-attr docutils literal notranslate\">UniqueConstraint.include</code></a>), set\n<code class=\"docutils literal notranslate\">DatabaseFeatures.supports_covering_indexes</code> to <code class=\"docutils literal notranslate\">True</code>.</p></li>\n<li><p>Third-party database backends must implement support for column database\ncollations on <code class=\"docutils literal notranslate\">CharField</code>s and <code class=\"docutils literal notranslate\">TextField</code>s or set\n<code class=\"docutils literal notranslate\">DatabaseFeatures.supports_collation_on_charfield</code> and\n<code class=\"docutils literal notranslate\">DatabaseFeatures.supports_collation_on_textfield</code> to <code class=\"docutils literal notranslate\">False</code>. If\nnon-deterministic collations are not supported, set\n<code class=\"docutils literal notranslate\">supports_non_deterministic_collations</code> to <code class=\"docutils literal notranslate\">False</code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\">DatabaseOperations.random_function_sql()</code> is removed in favor of the new\n<a class=\"reference internal\" href=\"/en/dev/ref/models/database-functions/#django.db.models.functions.Random\" title=\"django.db.models.functions.Random\"><code class=\"xref py py-class docutils literal notranslate\">Random</code></a> database function.</p></li>\n<li><p><code class=\"docutils literal notranslate\">DatabaseOperations.date_trunc_sql()</code> and\n<code class=\"docutils literal notranslate\">DatabaseOperations.time_trunc_sql()</code> now take the optional <code class=\"docutils literal notranslate\">tzname</code>\nargument in order to truncate in a specific timezone.</p></li>\n<li><p><code class=\"docutils literal notranslate\">DatabaseClient.runshell()</code> now gets arguments and an optional dictionary\nwith environment variables to the underlying command-line client from\n<code class=\"docutils literal notranslate\">DatabaseClient.settings_to_cmd_args_env()</code> method. Third-party database\nbackends must implement <code class=\"docutils literal notranslate\">DatabaseClient.settings_to_cmd_args_env()</code> or\noverride <code class=\"docutils literal notranslate\">DatabaseClient.runshell()</code>.</p></li>\n<li><p>Third-party database backends must implement support for functional indexes\n(<a class=\"reference internal\" href=\"/en/dev/ref/models/indexes/#django.db.models.Index.expressions\" title=\"django.db.models.Index.expressions\"><code class=\"xref py py-attr docutils literal notranslate\">Index.expressions</code></a>) or set\n<code class=\"docutils literal notranslate\">DatabaseFeatures.supports_expression_indexes</code> to <code class=\"docutils literal notranslate\">False</code>. If <code class=\"docutils literal notranslate\">COLLATE</code>\nis not a part of the <code class=\"docutils literal notranslate\">CREATE INDEX</code> statement, set\n<code class=\"docutils literal notranslate\">DatabaseFeatures.collate_as_index_expression</code> to <code class=\"docutils literal notranslate\">True</code>.</p></li>\n</ul>\n</section>\n<section id=\"id1\">\n<h3><a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/#module-django.contrib.admin\" title=\"django.contrib.admin: Django's admin site.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.admin</code></a><a class=\"heading-anchor\" href=\"#id1\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<ul class=\"simple\">\n<li><p>Pagination links in the admin are now 1-indexed instead of 0-indexed, i.e.\nthe query string for the first page is <code class=\"docutils literal notranslate\">?p=1</code> instead of <code class=\"docutils literal notranslate\">?p=0</code>.</p></li>\n<li><p>The new admin catch-all view will break URL patterns routed after the admin\nURLs and matching the admin URL prefix. You can either adjust your URL\nordering or, if necessary, set <a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/#django.contrib.admin.AdminSite.final_catch_all_view\" title=\"django.contrib.admin.AdminSite.final_catch_all_view\"><code class=\"xref py py-attr docutils literal notranslate\">AdminSite.final_catch_all_view</code></a> to <code class=\"docutils literal notranslate\">False</code>,\ndisabling the catch-all view. See <a class=\"reference internal\" href=\"#whats-new-3-2\"><span class=\"std std-ref\">What’s new in Django 3.2</span></a> for more details.</p></li>\n<li><p>Minified JavaScript files are no longer included with the admin. If you\nrequire these files to be minified, consider using a third party app or\nexternal build tool. The minified vendored JavaScript files packaged with the\nadmin (e.g. <a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/#contrib-admin-jquery\"><span class=\"std std-ref\">jquery.min.js</span></a>) are still included.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.prepopulated_fields\" title=\"django.contrib.admin.ModelAdmin.prepopulated_fields\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.prepopulated_fields</code></a> no longer strips English stop words,\nsuch as <code class=\"docutils literal notranslate\">'a'</code> or <code class=\"docutils literal notranslate\">'an'</code>.</p></li>\n</ul>\n</section>\n<section id=\"id2\">\n<h3><a class=\"reference internal\" href=\"/en/dev/ref/contrib/gis/#module-django.contrib.gis\" title=\"django.contrib.gis: Geographic Information System (GIS) extensions for Django\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.gis</code></a><a class=\"heading-anchor\" href=\"#id2\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<ul class=\"simple\">\n<li><p>Support for PostGIS 2.2 is removed.</p></li>\n<li><p>The Oracle backend now clones polygons (and geometry collections containing\npolygons) before reorienting them and saving them to the database. They are\nno longer mutated in place. You might notice this if you use the polygons\nafter a model is saved.</p></li>\n</ul>\n</section>\n<section id=\"dropped-support-for-postgresql-9-5\">\n<h3>Dropped support for PostgreSQL 9.5<a class=\"heading-anchor\" href=\"#dropped-support-for-postgresql-9-5\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Upstream support for PostgreSQL 9.5 ends in February 2021. Django 3.2 supports\nPostgreSQL 9.6 and higher.</p>\n</section>\n<section id=\"dropped-support-for-mysql-5-6\">\n<h3>Dropped support for MySQL 5.6<a class=\"heading-anchor\" href=\"#dropped-support-for-mysql-5-6\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The end of upstream support for MySQL 5.6 is April 2021. Django 3.2 supports\nMySQL 5.7 and higher.</p>\n</section>\n<section id=\"miscellaneous\">\n<h3>Miscellaneous<a class=\"heading-anchor\" href=\"#miscellaneous\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<ul>\n<li><p>Django now supports non-<code class=\"docutils literal notranslate\">pytz</code> time zones, such as Python 3.9+’s\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/zoneinfo.html#module-zoneinfo\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\">zoneinfo</code></a> module and its backport.</p></li>\n<li><p>The undocumented <code class=\"docutils literal notranslate\">SpatiaLiteOperations.proj4_version()</code> method is renamed\nto <code class=\"docutils literal notranslate\">proj_version()</code>.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/utils/#django.utils.text.slugify\" title=\"django.utils.text.slugify\"><code class=\"xref py py-func docutils literal notranslate\">slugify()</code></a> now removes leading and trailing dashes\nand underscores.</p></li>\n<li><p>The <a class=\"reference internal\" href=\"/en/dev/ref/contrib/humanize/#std-templatefilter-intcomma\"><code class=\"xref std std-tfilter docutils literal notranslate\">intcomma</code></a> and <a class=\"reference internal\" href=\"/en/dev/ref/contrib/humanize/#std-templatefilter-intword\"><code class=\"xref std std-tfilter docutils literal notranslate\">intword</code></a> template filters no longer\ndepend on the <code class=\"docutils literal notranslate\">USE_L10N</code> setting.</p></li>\n<li><p>Support for <code class=\"docutils literal notranslate\">argon2-cffi</code> &lt; 19.1.0 is removed.</p></li>\n<li><p>The cache keys no longer includes the language when internationalization is\ndisabled (<code class=\"docutils literal notranslate\">USE_I18N = False</code>) and localization is enabled\n(<code class=\"docutils literal notranslate\">USE_L10N = True</code>). After upgrading to Django 3.2 in such configurations,\nthe first request to any previously cached value will be a cache miss.</p></li>\n<li><p><code class=\"docutils literal notranslate\">ForeignKey.validate()</code> now uses\n<a class=\"reference internal\" href=\"/en/dev/topics/db/managers/#django.db.models.Model._base_manager\" title=\"django.db.models.Model._base_manager\"><code class=\"xref py py-attr docutils literal notranslate\">_base_manager</code></a> rather than\n<a class=\"reference internal\" href=\"/en/dev/topics/db/managers/#django.db.models.Model._default_manager\" title=\"django.db.models.Model._default_manager\"><code class=\"xref py py-attr docutils literal notranslate\">_default_manager</code></a> to check that related\ninstances exist.</p></li>\n<li><p>When an application defines an <a class=\"reference internal\" href=\"/en/dev/ref/applications/#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> subclass in\nan <code class=\"docutils literal notranslate\">apps.py</code> submodule, Django now uses this configuration automatically,\neven if it isn’t enabled with <code class=\"docutils literal notranslate\">default_app_config</code>. Set <code class=\"docutils literal notranslate\">default = False</code>\nin the <a class=\"reference internal\" href=\"/en/dev/ref/applications/#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> subclass if you need to prevent this\nbehavior. See <a class=\"reference internal\" href=\"#whats-new-3-2\"><span class=\"std std-ref\">What’s new in Django 3.2</span></a> for more details.</p></li>\n<li><p>Instantiating an abstract model now raises <code class=\"docutils literal notranslate\">TypeError</code>.</p></li>\n<li><p>Keyword arguments to <a class=\"reference internal\" href=\"/en/dev/topics/testing/advanced/#django.test.utils.setup_databases\" title=\"django.test.utils.setup_databases\"><code class=\"xref py py-func docutils literal notranslate\">setup_databases()</code></a> are now\nkeyword-only.</p></li>\n<li><p>The undocumented <code class=\"docutils literal notranslate\">django.utils.http.limited_parse_qsl()</code> function is\nremoved. Please use <a class=\"reference external\" href=\"https://docs.python.org/3/library/urllib.parse.html#urllib.parse.parse_qsl\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\">urllib.parse.parse_qsl()</code></a> instead.</p></li>\n<li><p><code class=\"docutils literal notranslate\">django.test.utils.TestContextDecorator</code> now uses\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest.TestCase.addCleanup\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\">addCleanup()</code></a> so that cleanups registered in the\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest.TestCase.setUp\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\">setUp()</code></a> method are called before\n<code class=\"docutils literal notranslate\">TestContextDecorator.disable()</code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\">SessionMiddleware</code> now raises a\n<a class=\"reference internal\" href=\"/en/dev/ref/exceptions/#django.contrib.sessions.exceptions.SessionInterrupted\" title=\"django.contrib.sessions.exceptions.SessionInterrupted\"><code class=\"xref py py-exc docutils literal notranslate\">SessionInterrupted</code></a> exception\ninstead of <a class=\"reference internal\" href=\"/en/dev/ref/exceptions/#django.core.exceptions.SuspiciousOperation\" title=\"django.core.exceptions.SuspiciousOperation\"><code class=\"xref py py-exc docutils literal notranslate\">SuspiciousOperation</code></a> when a session\nis destroyed in a concurrent request.</p></li>\n<li><p>The <a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">django.db.models.Field</code></a> equality operator now correctly\ndistinguishes inherited field instances across models. Additionally, the\nordering of such fields is now defined.</p></li>\n<li><p>The undocumented <code class=\"docutils literal notranslate\">django.core.files.locks.lock()</code> function now returns\n<code class=\"docutils literal notranslate\">False</code> if the file cannot be locked, instead of raising\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#BlockingIOError\" title=\"(in Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\">BlockingIOError</code></a>.</p></li>\n<li><p>The password reset mechanism now invalidates tokens when the user email is\nchanged.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemessages</code></a> command no longer processes invalid locales specified\nusing <a class=\"reference internal\" href=\"/en/dev/ref/django-admin/#cmdoption-makemessages-locale\"><code class=\"xref std std-option docutils literal notranslate\">makemessages --locale</code></a> option, when they contain hyphens\n(<code class=\"docutils literal notranslate\">'-'</code>).</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">django.contrib.auth.forms.ReadOnlyPasswordHashField</code> form field is now\n<a class=\"reference internal\" href=\"/en/dev/ref/forms/fields/#django.forms.Field.disabled\" title=\"django.forms.Field.disabled\"><code class=\"xref py py-attr docutils literal notranslate\">disabled</code></a> by default. Therefore\n<code class=\"docutils literal notranslate\">UserChangeForm.clean_password()</code> is no longer required to return the\ninitial value.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">cache.get_many()</code>, <code class=\"docutils literal notranslate\">get_or_set()</code>, <code class=\"docutils literal notranslate\">has_key()</code>, <code class=\"docutils literal notranslate\">incr()</code>,\n<code class=\"docutils literal notranslate\">decr()</code>, <code class=\"docutils literal notranslate\">incr_version()</code>, and <code class=\"docutils literal notranslate\">decr_version()</code> cache operations now\ncorrectly handle <code class=\"docutils literal notranslate\">None</code> stored in the cache, in the same way as any other\nvalue, instead of behaving as though the key didn’t exist.</p>\n<p>Due to a <code class=\"docutils literal notranslate\">python-memcached</code> limitation, the previous behavior is kept for\nthe deprecated <code class=\"docutils literal notranslate\">MemcachedCache</code> backend.</p>\n</li>\n<li><p>The minimum supported version of SQLite is increased from 3.8.3 to 3.9.0.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/contrib/messages/#django.contrib.messages.storage.cookie.CookieStorage\" title=\"django.contrib.messages.storage.cookie.CookieStorage\"><code class=\"xref py py-class docutils literal notranslate\">CookieStorage</code></a> now stores\nmessages in the <span class=\"target\" id=\"index-0\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc6265.html\"><strong>RFC 6265</strong></a> compliant format. Support for cookies that use\nthe old format remains until Django 4.1.</p></li>\n<li><p>The minimum supported version of <code class=\"docutils literal notranslate\">asgiref</code> is increased from 3.2.10 to\n3.3.2.</p></li>\n</ul>\n</section>\n</section>\n<section id=\"features-deprecated-in-3-2\">\n<span id=\"deprecated-features-3-2\"></span><h2>Features deprecated in 3.2<a class=\"heading-anchor\" href=\"#features-deprecated-in-3-2\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"id3\">\n<h3>Miscellaneous<a class=\"heading-anchor\" href=\"#id3\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<ul class=\"simple\">\n<li><p>Assigning objects which don’t support creating deep copies with\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/copy.html#copy.deepcopy\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\">copy.deepcopy()</code></a> to class attributes in\n<a class=\"reference internal\" href=\"/en/dev/topics/testing/tools/#django.test.TestCase.setUpTestData\" title=\"django.test.TestCase.setUpTestData\"><code class=\"xref py py-meth docutils literal notranslate\">TestCase.setUpTestData()</code></a> is deprecated.</p></li>\n<li><p>Using a boolean value in <a class=\"reference internal\" href=\"/en/dev/howto/custom-management-commands/#django.core.management.BaseCommand.requires_system_checks\" title=\"django.core.management.BaseCommand.requires_system_checks\"><code class=\"xref py py-attr docutils literal notranslate\">BaseCommand.requires_system_checks</code></a> is\ndeprecated. Use <code class=\"docutils literal notranslate\">'__all__'</code> instead of <code class=\"docutils literal notranslate\">True</code>, and <code class=\"docutils literal notranslate\">[]</code> (an empty list)\ninstead of <code class=\"docutils literal notranslate\">False</code>.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">whitelist</code> argument and <code class=\"docutils literal notranslate\">domain_whitelist</code> attribute of\n<a class=\"reference internal\" href=\"/en/dev/ref/validators/#django.core.validators.EmailValidator\" title=\"django.core.validators.EmailValidator\"><code class=\"xref py py-class docutils literal notranslate\">EmailValidator</code></a> are deprecated. Use\n<code class=\"docutils literal notranslate\">allowlist</code> instead of <code class=\"docutils literal notranslate\">whitelist</code>, and <code class=\"docutils literal notranslate\">domain_allowlist</code> instead of\n<code class=\"docutils literal notranslate\">domain_whitelist</code>. You may need to rename <code class=\"docutils literal notranslate\">whitelist</code> in existing\nmigrations.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">default_app_config</code> application configuration variable is deprecated,\ndue to the now automatic <code class=\"docutils literal notranslate\">AppConfig</code> discovery. See <a class=\"reference internal\" href=\"#whats-new-3-2\"><span class=\"std std-ref\">What’s new in Django 3.2</span></a>\nfor more details.</p></li>\n<li><p>Automatically calling <code class=\"docutils literal notranslate\">repr()</code> on a queryset in\n<code class=\"docutils literal notranslate\">TransactionTestCase.assertQuerysetEqual()</code>, when compared to string\nvalues, is deprecated. If you need the previous behavior, explicitly set\n<code class=\"docutils literal notranslate\">transform</code> to <code class=\"docutils literal notranslate\">repr</code>.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">django.core.cache.backends.memcached.MemcachedCache</code> backend is\ndeprecated as <code class=\"docutils literal notranslate\">python-memcached</code> has some problems and seems to be\nunmaintained. Use <code class=\"docutils literal notranslate\">django.core.cache.backends.memcached.PyMemcacheCache</code>\nor <code class=\"docutils literal notranslate\">django.core.cache.backends.memcached.PyLibMCCache</code> instead.</p></li>\n<li><p>The format of messages used by\n<code class=\"docutils literal notranslate\">django.contrib.messages.storage.cookie.CookieStorage</code> is different from\nthe format generated by older versions of Django. Support for the old format\nremains until Django 4.1.</p></li>\n</ul>\n</section>\n</section>","rootId":"django-3-2-release-notes","toc":[{"title":"Python compatibility","anchor":"python-compatibility","children":[]},{"title":"What’s new in Django 3.2","anchor":"what-s-new-in-django-3-2","children":[{"title":"Automatic AppConfig discovery","anchor":"automatic-appconfig-discovery","children":[]},{"title":"Customizing type of auto-created primary keys","anchor":"customizing-type-of-auto-created-primary-keys","children":[]},{"title":"Functional indexes","anchor":"functional-indexes","children":[]},{"title":"pymemcache support","anchor":"pymemcache-support","children":[]},{"title":"New decorators for the admin site","anchor":"new-decorators-for-the-admin-site","children":[]},{"title":"Minor features","anchor":"minor-features","children":[{"title":"django.contrib.admin","anchor":"django-contrib-admin","children":[]},{"title":"django.contrib.auth","anchor":"django-contrib-auth","children":[]},{"title":"django.contrib.contenttypes","anchor":"django-contrib-contenttypes","children":[]},{"title":"django.contrib.gis","anchor":"django-contrib-gis","children":[]},{"title":"django.contrib.postgres","anchor":"django-contrib-postgres","children":[]},{"title":"django.contrib.sitemaps","anchor":"django-contrib-sitemaps","children":[]},{"title":"django.contrib.syndication","anchor":"django-contrib-syndication","children":[]},{"title":"Database backends","anchor":"database-backends","children":[]},{"title":"Decorators","anchor":"decorators","children":[]},{"title":"Error Reporting","anchor":"error-reporting","children":[]},{"title":"File Uploads","anchor":"file-uploads","children":[]},{"title":"Forms","anchor":"forms","children":[]},{"title":"Generic Views","anchor":"generic-views","children":[]},{"title":"Management Commands","anchor":"management-commands","children":[]},{"title":"Migrations","anchor":"migrations","children":[]},{"title":"Models","anchor":"models","children":[]},{"title":"Pagination","anchor":"pagination","children":[]},{"title":"Requests and Responses","anchor":"requests-and-responses","children":[]},{"title":"Security","anchor":"security","children":[]},{"title":"Serialization","anchor":"serialization","children":[]},{"title":"Signals","anchor":"signals","children":[]},{"title":"Templates","anchor":"templates","children":[]},{"title":"Tests","anchor":"tests","children":[]},{"title":"Utilities","anchor":"utilities","children":[]},{"title":"Validators","anchor":"validators","children":[]}]}]},{"title":"Backwards incompatible changes in 3.2","anchor":"backwards-incompatible-changes-in-3-2","children":[{"title":"Database backend API","anchor":"database-backend-api","children":[]},{"title":"django.contrib.admin","anchor":"id1","children":[]},{"title":"django.contrib.gis","anchor":"id2","children":[]},{"title":"Dropped support for PostgreSQL 9.5","anchor":"dropped-support-for-postgresql-9-5","children":[]},{"title":"Dropped support for MySQL 5.6","anchor":"dropped-support-for-mysql-5-6","children":[]},{"title":"Miscellaneous","anchor":"miscellaneous","children":[]}]},{"title":"Features deprecated in 3.2","anchor":"features-deprecated-in-3-2","children":[{"title":"Miscellaneous","anchor":"id3","children":[]}]}],"breadcrumbs":[{"docname":"releases/index","title":"Release notes","url":"/en/dev/releases/"}],"prev":{"docname":"releases/3.2.1","title":"Django 3.2.1 release notes","url":"/en/dev/releases/3.2.1/"},"next":{"docname":"releases/3.1.14","title":"Django 3.1.14 release notes","url":"/en/dev/releases/3.1.14/"},"formats":{"html":"/en/dev/releases/3.2/","markdown":"/en/dev/releases/3.2.md","json":"/en/dev/releases/3.2.json"},"source":"https://github.com/django/django/blob/main/docs/releases/3.2.txt","official":"https://docs.djangoproject.com/en/dev/releases/3.2/","inVersions":["dev","6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2"],"inLocales":["en"]}