{"title":"Django 6.1 release notes","version":"dev","locale":"en","docname":"releases/6.1","url":"/en/dev/releases/6.1/","canonical":"https://djangodocs.dev/en/dev/releases/6.1/","summary":"Welcome to Django 6.1! 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 6.1 release notes<a class=\"heading-anchor\" href=\"#django-6-1-release-notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p><em>August 5, 2026</em></p>\n<p>Welcome to Django 6.1!</p>\n<p>These release notes cover the <a class=\"reference internal\" href=\"#whats-new-6-1\"><span class=\"std std-ref\">new features</span></a>, as well as\nsome <a class=\"reference internal\" href=\"#backwards-incompatible-6-1\"><span class=\"std std-ref\">backwards incompatible changes</span></a> you’ll\nwant to be aware of when upgrading from Django 6.0 or earlier. We’ve\n<a class=\"reference internal\" href=\"#deprecated-features-6-1\"><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>Mainstream support is expected to end in April 2027. Extended support is\nexpected to end in December 2027.</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 6.1 supports Python 3.12, 3.13, and 3.14. We <strong>highly recommend</strong>, and\nonly officially support, the latest release of each series.</p>\n</section>\n<section id=\"what-s-new-in-django-6-1\">\n<span id=\"whats-new-6-1\"></span><h2>What’s new in Django 6.1<a class=\"heading-anchor\" href=\"#what-s-new-in-django-6-1\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"model-field-fetch-modes\">\n<h3>Model field fetch modes<a class=\"heading-anchor\" href=\"#model-field-fetch-modes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The on-demand fetching behavior of model fields is now configurable with\n<a class=\"reference internal\" href=\"/en/dev/topics/db/fetch-modes/\"><span class=\"doc\">fetch modes</span></a>. These modes allow you to control\nhow Django fetches data from the database when an unfetched field is accessed.</p>\n<p>Django provides three fetch modes:</p>\n<ol class=\"arabic\">\n<li><p><code class=\"docutils literal notranslate\">FETCH_ONE</code>, the default, fetches the missing field for the current\ninstance only. This mode represents Django’s existing behavior.</p></li>\n<li><p><code class=\"docutils literal notranslate\">FETCH_PEERS</code> fetches a missing field for all instances that came from\nthe same <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a>.</p>\n<p>This mode works like an on-demand <code class=\"docutils literal notranslate\">prefetch_related()</code>. It can reduce most\ncases of the “N+1 queries problem” to two queries without any work to\nmaintain a list of fields to prefetch.</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\">FETCH_RAISE</code> raises a <a class=\"reference internal\" href=\"/en/dev/ref/exceptions/#django.core.exceptions.FieldFetchBlocked\" title=\"django.core.exceptions.FieldFetchBlocked\"><code class=\"xref py py-exc docutils literal notranslate\">FieldFetchBlocked</code></a>\nexception.</p>\n<p>This mode can prevent unintentional queries in performance-critical\nsections of code.</p>\n</li>\n</ol>\n<p>Use the new method <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.fetch_mode\" title=\"django.db.models.query.QuerySet.fetch_mode\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.fetch_mode()</code></a> to set the fetch mode for model\ninstances fetched by the <code class=\"docutils literal notranslate\">QuerySet</code>:</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\nbooks <span class=\"o\">=</span> Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>fetch_mode<span class=\"p\">(</span>models<span class=\"o\">.</span>FETCH_PEERS<span class=\"p\">)</span>\n<span class=\"k\">for</span> book <span class=\"ow\">in</span> books<span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span>book<span class=\"o\">.</span>author<span class=\"o\">.</span>name<span class=\"p\">)</span>\n</code></pre></div>\n<p>Despite the loop accessing the <code class=\"docutils literal notranslate\">author</code> foreign key on each instance, the\n<code class=\"docutils literal notranslate\">FETCH_PEERS</code> fetch mode will make the above example perform only two\nqueries:</p>\n<ol class=\"arabic simple\">\n<li><p>Fetch all books.</p></li>\n<li><p>Fetch associated authors.</p></li>\n</ol>\n<p>See <a class=\"reference internal\" href=\"/en/dev/topics/db/fetch-modes/\"><span class=\"doc\">fetch modes</span></a> for more details.</p>\n</section>\n<section id=\"database-level-delete-options-for-foreignkey-on-delete\">\n<h3>Database-level delete options for <code class=\"docutils literal notranslate\">ForeignKey.on_delete</code><a class=\"heading-anchor\" href=\"#database-level-delete-options-for-foreignkey-on-delete\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.ForeignKey.on_delete\" title=\"django.db.models.ForeignKey.on_delete\"><code class=\"xref py py-attr docutils literal notranslate\">ForeignKey.on_delete</code></a> now supports database-level delete options:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.DB_CASCADE\" title=\"django.db.models.DB_CASCADE\"><code class=\"xref py py-attr docutils literal notranslate\">DB_CASCADE</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.DB_SET_NULL\" title=\"django.db.models.DB_SET_NULL\"><code class=\"xref py py-attr docutils literal notranslate\">DB_SET_NULL</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.DB_SET_DEFAULT\" title=\"django.db.models.DB_SET_DEFAULT\"><code class=\"xref py py-attr docutils literal notranslate\">DB_SET_DEFAULT</code></a></p></li>\n</ul>\n<p>These options handle deletion logic entirely within the database, using the SQL\n<code class=\"docutils literal notranslate\">ON DELETE</code> clause. They are thus more efficient than the existing\nPython-level options, as Django does not need to load objects before deleting\nthem. As a consequence, the <a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.DB_CASCADE\" title=\"django.db.models.DB_CASCADE\"><code class=\"xref py py-attr docutils literal notranslate\">DB_CASCADE</code></a> option does\nnot trigger the <code class=\"docutils literal notranslate\">pre_delete</code> or <code class=\"docutils literal notranslate\">post_delete</code> signals.</p>\n</section>\n<section id=\"mailers\">\n<h3>Mailers<a class=\"heading-anchor\" href=\"#mailers\"><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/settings/#std-setting-MAILERS\"><code class=\"xref std std-setting docutils literal notranslate\">MAILERS</code></a> setting supports configuring multiple email backends\nwith different options, similar to existing mechanisms for <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\">CACHES</code></a>,\n<a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASES</code></a>, <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-STORAGES\"><code class=\"xref std std-setting docutils literal notranslate\">STORAGES</code></a>, and <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-TASKS\"><code class=\"xref std std-setting docutils literal notranslate\">TASKS</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>MAILERS <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.mail.backends.smtp.EmailBackend&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"s2\">&quot;host&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;smtp.example.com&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;use_tls&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;marketing&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;example.third.party.EmailBackend&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"s2\">&quot;region&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;africa-1&quot;</span><span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>You can select a mailer with the new <code class=\"docutils literal notranslate\">using</code> argument to <a class=\"reference internal\" href=\"/en/dev/topics/email/#topic-email-sending\"><span class=\"std std-ref\">email sending</span></a> functions, or obtain an email backend instance with\n<a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.mailers\" title=\"django.core.mail.mailers\"><code class=\"xref py py-data docutils literal notranslate\">mail.mailers[alias]</code></a>. See\n<a class=\"reference internal\" href=\"/en/dev/topics/email/\"><span class=\"doc\">Sending email</span></a> for more details.</p>\n<p><a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-MAILERS\"><code class=\"xref std std-setting docutils literal notranslate\">MAILERS</code></a> is not yet enabled by default in existing projects. It will\nreplace <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-EMAIL_BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\">EMAIL_BACKEND</code></a> and related <code class=\"docutils literal notranslate\">EMAIL_*</code> settings in Django\n7.0. Until then, the older settings will continue to work but will issue\ndeprecation warnings: see the list of <a class=\"reference internal\" href=\"#mailers-deprecations\"><span class=\"std std-ref\">email deprecations</span></a> below.</p>\n<p>You can opt into the new feature at any time before Django 2028; see\n<a class=\"reference internal\" href=\"/en/dev/howto/mailers-migration/#migrating-to-mailers\"><span class=\"std std-ref\">Migrating email to mailers</span></a>. To ease the transition,\n<a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.mailers.default\" title=\"django.core.mail.mailers.default\"><code class=\"xref py py-data docutils literal notranslate\">mail.mailers[&quot;default&quot;]</code></a> works with\neither <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-MAILERS\"><code class=\"xref std std-setting docutils literal notranslate\">MAILERS</code></a> or the deprecated <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-EMAIL_BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\">EMAIL_BACKEND</code></a> setting\ndefined. The deprecated <a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.get_connection\" title=\"django.core.mail.get_connection\"><code class=\"xref py py-func docutils literal notranslate\">get_connection()</code></a> function will\nalso return an instance of the default mailer when <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-MAILERS\"><code class=\"xref std std-setting docutils literal notranslate\">MAILERS</code></a> is\ndefined.</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 class=\"simple\">\n<li><p>The admin site login view now redirects authenticated users to the next URL,\nif available, instead of always redirecting to the admin index page.</p></li>\n<li><p>The admin’s <code class=\"docutils literal notranslate\">FilteredSelectMultiple</code> widget now uses <code class=\"docutils literal notranslate\">&lt;optgroup&gt;</code>s to\npreserve <a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#field-choices-named-groups\"><span class=\"std std-ref\">named groups</span></a> (e.g.\n<code class=\"docutils literal notranslate\">choices=[(&quot;Group&quot;, [(&quot;1&quot;, &quot;Item&quot;)]), ...]</code>).</p></li>\n<li><p>When <a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_select_related\" title=\"django.contrib.admin.ModelAdmin.list_select_related\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.list_select_related</code></a> is <code class=\"docutils literal notranslate\">False</code> (the default),\nthe change list now selects only the foreign key fields specified in\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\">ModelAdmin.list_display</code></a>, rather than all foreign key fields. This\nshould improve performance for models with many foreign key fields.</p></li>\n<li><p>The <a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.delete_confirmation_max_display\" title=\"django.contrib.admin.ModelAdmin.delete_confirmation_max_display\"><code class=\"xref py py-attr docutils literal notranslate\">delete_confirmation_max_display</code></a>\noption allows customizing how many objects are displayed on admin delete\nconfirmation pages and inline protected deletion errors before the remainder\nis truncated. The default is <code class=\"docutils literal notranslate\">None</code> (no truncation).</p></li>\n<li><p>In order to improve accessibility of the admin change forms:</p>\n<ul>\n<li><p>Form fields are now shown below their respective labels instead of next to\nthem.</p></li>\n<li><p>Help text is now shown after the field label and before the field input.</p></li>\n<li><p>Validation errors are now shown after the help text and before the field\ninput.</p></li>\n<li><p>Checkboxes are an exception to the above changes and continue to be\ndisplayed in their original layout.</p></li>\n</ul>\n</li>\n<li><p><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> now uses boolean icons\nfor boolean fields on related models.</p></li>\n<li><p>The new <code class=\"docutils literal notranslate\">location</code> keyword argument of the\n<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 specifies which admin views\nthe action is available on. The action is available on the admin change list\npage by default. It can also be available on the admin change form. See\n<a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/actions/#admin-action-availability\"><span class=\"std std-ref\">Controlling where actions are available</span></a> for details.</p></li>\n<li><p>The new <code class=\"docutils literal notranslate\">description_plural</code> keyword argument of the\n<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 specifies a human-readable\ndescription for actions on the admin change list page. Defaults to the\n<code class=\"docutils literal notranslate\">description</code> value. This is useful when the action is available on both\nthe admin change list and admin change form.</p></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 class=\"simple\">\n<li><p>The default iteration count for the PBKDF2 password hasher is increased from\n1,200,000 to 1,500,000.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/contrib/auth/#django.contrib.auth.models.Permission.name\" title=\"django.contrib.auth.models.Permission.name\"><code class=\"xref py py-attr docutils literal notranslate\">Permission.name</code></a> and <a class=\"reference internal\" href=\"/en/dev/ref/contrib/auth/#django.contrib.auth.models.Permission.codename\" title=\"django.contrib.auth.models.Permission.codename\"><code class=\"xref py py-attr docutils literal notranslate\">Permission.codename</code></a> values are now\nrenamed when renaming models via a migration.</p></li>\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/ref/contrib/auth/#django.contrib.auth.models.Permission.user_perm_str\" title=\"django.contrib.auth.models.Permission.user_perm_str\"><code class=\"xref py py-attr docutils literal notranslate\">Permission.user_perm_str</code></a> property returns the string\nsuitable to use with <a class=\"reference internal\" href=\"/en/dev/ref/contrib/auth/#django.contrib.auth.models.User.has_perm\" title=\"django.contrib.auth.models.User.has_perm\"><code class=\"xref py py-meth docutils literal notranslate\">User.has_perm()</code></a>.</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/geoquerysets/#std-fieldlookup-isempty\"><code class=\"xref std std-lookup docutils literal notranslate\">isempty</code></a> lookup and\n<a class=\"reference internal\" href=\"/en/dev/ref/contrib/gis/functions/#django.contrib.gis.db.models.functions.IsEmpty\" title=\"django.contrib.gis.db.models.functions.IsEmpty\"><code class=\"xref py py-class docutils literal notranslate\">IsEmpty()</code></a>\ndatabase function are now supported on SpatiaLite.</p></li>\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/ref/contrib/gis/geoquerysets/#std-fieldlookup-num_dimensions\"><code class=\"xref std std-lookup docutils literal notranslate\">num_dimensions</code></a> lookup and <a class=\"reference internal\" href=\"/en/dev/ref/contrib/gis/functions/#django.contrib.gis.db.models.functions.NumDimensions\" title=\"django.contrib.gis.db.models.functions.NumDimensions\"><code class=\"xref py py-class docutils literal notranslate\">NumDimensions()</code></a> database function\nallow filtering geometries by the number of dimensions on PostGIS and\nSpatiaLite.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/contrib/gis/forms-api/#django.contrib.gis.forms.widgets.OpenLayersWidget\" title=\"django.contrib.gis.forms.widgets.OpenLayersWidget\"><code class=\"xref py py-class docutils literal notranslate\">OpenLayersWidget</code></a> is now based on\nOpenLayers 10.9.0 (previously 7.2.2).</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><a class=\"reference internal\" href=\"/en/dev/ref/django-admin/#django-admin-inspectdb\"><code class=\"xref std std-djadmin docutils literal notranslate\">inspectdb</code></a> now introspects\n<a class=\"reference internal\" href=\"/en/dev/ref/contrib/postgres/fields/#django.contrib.postgres.fields.HStoreField\" title=\"django.contrib.postgres.fields.HStoreField\"><code class=\"xref py py-class docutils literal notranslate\">HStoreField</code></a> when <code class=\"docutils literal notranslate\">psycopg</code> 3.2+ is\ninstalled and <code class=\"docutils literal notranslate\">django.contrib.postgres</code> is in <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>.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/contrib/postgres/constraints/#django.contrib.postgres.constraints.ExclusionConstraint\" title=\"django.contrib.postgres.constraints.ExclusionConstraint\"><code class=\"xref py py-class docutils literal notranslate\">ExclusionConstraint</code></a> now\nsupports the Hash index type.</p></li>\n</ul>\n</section>\n<section id=\"django-contrib-sessions\">\n<h4><a class=\"reference internal\" href=\"/en/dev/topics/http/sessions/#module-django.contrib.sessions\" title=\"django.contrib.sessions: Provides session management for Django projects.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.sessions</code></a><a class=\"heading-anchor\" href=\"#django-contrib-sessions\"><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/http/sessions/#django.contrib.sessions.backends.base.SessionBase\" title=\"django.contrib.sessions.backends.base.SessionBase\"><code class=\"xref py py-class docutils literal notranslate\">SessionBase</code></a> now supports\nboolean evaluation via\n<a class=\"reference internal\" href=\"/en/dev/topics/http/sessions/#django.contrib.sessions.backends.base.SessionBase.__bool__\" title=\"django.contrib.sessions.backends.base.SessionBase.__bool__\"><code class=\"xref py py-meth docutils literal notranslate\">__bool__()</code></a>.</p></li>\n</ul>\n</section>\n<section id=\"csp\">\n<h4>CSP<a class=\"heading-anchor\" href=\"#csp\"><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/templates/builtins/#std-templatetag-csp_nonce_attr\"><code class=\"xref std std-ttag docutils literal notranslate\">csp_nonce_attr</code></a> template tag renders the CSP nonce attribute\non <code class=\"docutils literal notranslate\">&lt;script&gt;</code> and <code class=\"docutils literal notranslate\">&lt;link&gt;</code> elements, or renders a\n<a class=\"reference internal\" href=\"/en/dev/topics/forms/media/#django.forms.Media\" title=\"django.forms.Media\"><code class=\"xref py py-class docutils literal notranslate\">Media</code></a> object’s assets with the nonce applied, when the\n<a class=\"reference internal\" href=\"/en/dev/ref/templates/api/#django.template.context_processors.csp\" title=\"django.template.context_processors.csp\"><code class=\"xref py py-func docutils literal notranslate\">csp()</code></a> context processor is\nconfigured. See <a class=\"reference internal\" href=\"/en/dev/ref/csp/#csp-nonce\"><span class=\"std std-ref\">Nonce usage</span></a> for details.</p></li>\n<li><p>A new <code class=\"docutils literal notranslate\">security.W027</code> system check warns when\n<a class=\"reference internal\" href=\"/en/dev/ref/middleware/#django.middleware.csp.ContentSecurityPolicyMiddleware\" title=\"django.middleware.csp.ContentSecurityPolicyMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">ContentSecurityPolicyMiddleware</code></a> is enabled\nwith <code class=\"docutils literal notranslate\">CSP.NONCE</code> in a CSP policy but\n<code class=\"docutils literal notranslate\">django.template.context_processors.csp</code> is not configured.</p></li>\n<li><p>CSP nonce attributes are now added on <code class=\"docutils literal notranslate\">&lt;script&gt;</code>, <code class=\"docutils literal notranslate\">&lt;style&gt;</code>, and\n<code class=\"docutils literal notranslate\">&lt;link&gt;</code> elements in admin templates and all built-in templates when the\n<a class=\"reference internal\" href=\"/en/dev/ref/templates/api/#django.template.context_processors.csp\" title=\"django.template.context_processors.csp\"><code class=\"xref py py-func docutils literal notranslate\">csp()</code></a> context processor is\nconfigured. See <a class=\"reference internal\" href=\"/en/dev/howto/csp/#csp-nonce-config\"><span class=\"std std-ref\">Nonce config</span></a> for setup instructions.</p></li>\n</ul>\n</section>\n<section id=\"email\">\n<h4>Email<a class=\"heading-anchor\" href=\"#email\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<ul class=\"simple\">\n<li><p>A new <code class=\"docutils literal notranslate\">mail.E001</code> deployment-only system check prevents using one of\nDjango’s email backends that is not intended for production use in the\n<code class=\"docutils literal notranslate\">'default'</code> <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-MAILERS\"><code class=\"xref std std-setting docutils literal notranslate\">MAILERS</code></a> entry.</p></li>\n<li><p>A new <code class=\"docutils literal notranslate\">mail.W001</code> system check warns when <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-MAILERS\"><code class=\"xref std std-setting docutils literal notranslate\">MAILERS</code></a> is defined but\ndoes not include a <code class=\"docutils literal notranslate\">'default'</code> entry.</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 asset object <a class=\"reference internal\" href=\"/en/dev/topics/forms/media/#django.forms.Stylesheet\" title=\"django.forms.Stylesheet\"><code class=\"xref py py-class docutils literal notranslate\">Stylesheet</code></a> is available for\nadding custom HTML-attributes to stylesheet links in form media. See\n<a class=\"reference internal\" href=\"/en/dev/topics/forms/media/#form-media-asset-objects\"><span class=\"std std-ref\">paths as objects</span></a> for more details.</p></li>\n<li><p>The new constant <code class=\"docutils literal notranslate\">django.db.models.fields.BLANK_CHOICE_LABEL</code> defines a\nmore accessible and translatable default label for the blank choice in\nforms, which is appended to most <code class=\"docutils literal notranslate\">choices</code> lists. The transitional setting\n<a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-USE_BLANK_CHOICE_DASH\"><code class=\"xref std std-setting docutils literal notranslate\">USE_BLANK_CHOICE_DASH</code></a> allows you to revert back to the old\ndefault label.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/forms/fields/#django.forms.FilePathField\" title=\"django.forms.FilePathField\"><code class=\"xref py py-class docutils literal notranslate\">FilePathField</code></a> now provides a\n<a class=\"reference internal\" href=\"/en/dev/ref/forms/fields/#django.forms.FilePathField.set_choices\" title=\"django.forms.FilePathField.set_choices\"><code class=\"xref py py-meth docutils literal notranslate\">set_choices()</code></a> method to scan the\ndirectory at <a class=\"reference internal\" href=\"/en/dev/ref/forms/fields/#django.forms.FilePathField.path\" title=\"django.forms.FilePathField.path\"><code class=\"xref py py-attr docutils literal notranslate\">path</code></a> and refresh the\nfield’s choices. This allows per-request refreshing when called in a form’s\n<code class=\"docutils literal notranslate\">__init__()</code>.</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 new <a class=\"reference internal\" href=\"/en/dev/ref/class-based-views/base/#django.views.generic.base.RedirectView.preserve_request\" title=\"django.views.generic.base.RedirectView.preserve_request\"><code class=\"xref py py-attr docutils literal notranslate\">RedirectView.preserve_request</code></a> attribute allows preserving\nthe HTTP method and body during redirects, using 307/308 status codes instead\nof 302/301.</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>Management commands now set <a class=\"reference external\" href=\"https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">ArgumentParser</code></a>'s\n<code class=\"docutils literal notranslate\">suggest_on_error</code> argument to <code class=\"docutils literal notranslate\">True</code> by default on Python 3.14, enabling\nsuggestions for incorrectly typed subcommand names and argument choices.</p></li>\n<li><p>The <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> command now calls\n<a class=\"reference internal\" href=\"/en/dev/ref/signals/#django.db.models.signals.m2m_changed\" title=\"django.db.models.signals.m2m_changed\"><code class=\"xref py py-data docutils literal notranslate\">m2m_changed</code></a> signals with <code class=\"docutils literal notranslate\">raw=True</code> when\nloading fixtures.</p></li>\n<li><p>The <a class=\"reference internal\" href=\"/en/dev/ref/django-admin/#django-admin-sendtestemail\"><code class=\"xref std std-djadmin docutils literal notranslate\">sendtestemail</code></a> command now supports a <a class=\"reference internal\" href=\"/en/dev/ref/django-admin/#cmdoption-sendtestemail-using\"><code class=\"xref std std-option docutils literal notranslate\">--using</code></a> option to specify the <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-MAILERS\"><code class=\"xref std std-setting docutils literal notranslate\">MAILERS</code></a> alias.</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><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 supports chaining after\n<a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.values()</code></a> and <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values_list\" title=\"django.db.models.query.QuerySet.values_list\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.values_list()</code></a>.</p></li>\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/ref/models/expressions/#django.db.models.JSONNull\" title=\"django.db.models.JSONNull\"><code class=\"xref py py-class docutils literal notranslate\">JSONNull</code></a> expression provides an explicit\nway to represent the JSON scalar <code class=\"docutils literal notranslate\">null</code>. It can be used when saving a\ntop-level <a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\">JSONField</code></a> value, or querying for\ntop-level or nested JSON <code class=\"docutils literal notranslate\">null</code> values. See\n<a class=\"reference internal\" href=\"/en/dev/topics/db/queries/#storing-and-querying-for-none\"><span class=\"std std-ref\">Storing and querying for None</span></a> for usage examples and some caveats.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.DecimalField.max_digits\" title=\"django.db.models.DecimalField.max_digits\"><code class=\"xref py py-attr docutils literal notranslate\">DecimalField.max_digits</code></a>\nand <a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.DecimalField.decimal_places\" title=\"django.db.models.DecimalField.decimal_places\"><code class=\"xref py py-attr docutils literal notranslate\">DecimalField.decimal_places</code></a> are no longer required to be\nset on Oracle, PostgreSQL, and SQLite.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\">JSONField</code></a> now supports\n<a class=\"reference internal\" href=\"/en/dev/topics/db/queries/#key-index-and-path-transforms\"><span class=\"std std-ref\">negative array indexing</span></a> on Oracle\n21c+.</p></li>\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/ref/models/database-functions/#django.db.models.functions.UUID4\" title=\"django.db.models.functions.UUID4\"><code class=\"xref py py-class docutils literal notranslate\">UUID4</code></a> and\n<a class=\"reference internal\" href=\"/en/dev/ref/models/database-functions/#django.db.models.functions.UUID7\" title=\"django.db.models.functions.UUID7\"><code class=\"xref py py-class docutils literal notranslate\">UUID7</code></a> database functions were added.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.GeneratedField\" title=\"django.db.models.GeneratedField\"><code class=\"xref py py-class docutils literal notranslate\">GeneratedField</code></a> now supports virtual columns\n(<a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.GeneratedField.db_persist\" title=\"django.db.models.GeneratedField.db_persist\"><code class=\"xref py py-attr docutils literal notranslate\">db_persist</code></a> set to <code class=\"docutils literal notranslate\">False</code>) on\nPostgres 18+ and stored columns\n(<a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.GeneratedField.db_persist\" title=\"django.db.models.GeneratedField.db_persist\"><code class=\"xref py py-attr docutils literal notranslate\">db_persist</code></a> set to <code class=\"docutils literal notranslate\">True</code>) on\nOracle 23ai/26ai (23.7+).</p></li>\n<li><p>The <a class=\"reference internal\" href=\"/en/dev/ref/signals/#django.db.models.signals.m2m_changed\" title=\"django.db.models.signals.m2m_changed\"><code class=\"xref py py-data docutils literal notranslate\">m2m_changed</code></a> signal now receives a\n<code class=\"docutils literal notranslate\">raw</code> argument.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.StringAgg\" title=\"django.db.models.StringAgg\"><code class=\"xref py py-class docutils literal notranslate\">StringAgg</code></a> now supports <code class=\"docutils literal notranslate\">distinct=True</code> on SQLite\nwhen using the default delimiter <code class=\"docutils literal notranslate\">Value(&quot;,&quot;)</code> only.</p></li>\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.totally_ordered\" title=\"django.db.models.query.QuerySet.totally_ordered\"><code class=\"xref py py-attr docutils literal notranslate\">QuerySet.totally_ordered</code></a> property returns <code class=\"docutils literal notranslate\">True</code> if the\n<a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> is ordered and the ordering is\ndeterministic.</p></li>\n<li><p>The new <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.BitAnd\" title=\"django.db.models.BitAnd\"><code class=\"xref py py-class docutils literal notranslate\">BitAnd</code></a>, <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.BitOr\" title=\"django.db.models.BitOr\"><code class=\"xref py py-class docutils literal notranslate\">BitOr</code></a>,\nand <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.BitXor\" title=\"django.db.models.BitXor\"><code class=\"xref py py-class docutils literal notranslate\">BitXor</code></a> aggregates return the bitwise <code class=\"docutils literal notranslate\">AND</code>,\n<code class=\"docutils literal notranslate\">OR</code>, <code class=\"docutils literal notranslate\">XOR</code>, respectively. These aggregates were previously included only\nin <code class=\"docutils literal notranslate\">contrib.postgres</code>.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.BinaryField\" title=\"django.db.models.BinaryField\"><code class=\"xref py py-class docutils literal notranslate\">django.db.models.BinaryField</code></a> now validates Base64 input strictly.\nInvalid Base64 strings now raise <code class=\"docutils literal notranslate\">ValidationError</code> instead of being\nsilently accepted.</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><a class=\"reference internal\" href=\"/en/dev/ref/request-response/#django.http.HttpRequest.multipart_parser_class\" title=\"django.http.HttpRequest.multipart_parser_class\"><code class=\"xref py py-attr docutils literal notranslate\">HttpRequest.multipart_parser_class</code></a>\ncan now be customized to use a different multipart parser class.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/request-response/#django.http.HttpResponseRedirect\" title=\"django.http.HttpResponseRedirect\"><code class=\"xref py py-class docutils literal notranslate\">HttpResponseRedirect</code></a> (and its subclasses), as well as\nthe <a class=\"reference internal\" href=\"/en/dev/topics/http/shortcuts/#django.shortcuts.redirect\" title=\"django.shortcuts.redirect\"><code class=\"xref py py-func docutils literal notranslate\">redirect()</code></a> shortcut, now accept a <code class=\"docutils literal notranslate\">max_length</code>\nparameter to override the default maximum URL length limit.</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 class=\"simple\">\n<li><p>Signed cookies now use an unambiguous salt derivation by default. Set\n<a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-SIGNED_COOKIE_LEGACY_SALT_FALLBACK\"><code class=\"xref std std-setting docutils literal notranslate\">SIGNED_COOKIE_LEGACY_SALT_FALLBACK</code></a> to <code class=\"docutils literal notranslate\">True</code> to continue\naccepting legacy signed cookies.</p></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>Subclasses of models defining the <code class=\"docutils literal notranslate\">natural_key()</code> method can now opt out of\nnatural key serialization by overriding the method to return an empty tuple:\n<code class=\"docutils literal notranslate\">()</code>. This ensures primary keys are serialized when using\n<a class=\"reference internal\" href=\"/en/dev/ref/django-admin/#cmdoption-dumpdata-natural-primary\"><code class=\"xref std std-option docutils literal notranslate\">dumpdata --natural-primary</code></a>.</p></li>\n<li><p>The XML deserializer now raises\n<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 it encounters\nunexpected nested tags.</p></li>\n</ul>\n</section>\n<section id=\"tasks\">\n<h4>Tasks<a class=\"heading-anchor\" href=\"#tasks\"><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/tasks/#django.tasks.task\" title=\"django.tasks.task\"><code class=\"xref py py-func docutils literal notranslate\">task()</code></a> decorator now accepts <code class=\"docutils literal notranslate\">**kwargs</code>, which are\nforwarded to the backend’s\n<a class=\"reference internal\" href=\"/en/dev/ref/tasks/#django.tasks.backends.base.BaseTaskBackend.task_class\" title=\"django.tasks.backends.base.BaseTaskBackend.task_class\"><code class=\"xref py py-attr docutils literal notranslate\">task_class</code></a>.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/tasks/#django.tasks.Task\" title=\"django.tasks.Task\"><code class=\"xref py py-class docutils literal notranslate\">Task</code></a> and <a class=\"reference internal\" href=\"/en/dev/ref/tasks/#django.tasks.TaskResult\" title=\"django.tasks.TaskResult\"><code class=\"xref py py-class docutils literal notranslate\">TaskResult</code></a> instances\ncan now be pickled and unpickled.</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><a class=\"reference internal\" href=\"/en/dev/topics/testing/tools/#django.test.SimpleTestCase.assertContains\" title=\"django.test.SimpleTestCase.assertContains\"><code class=\"xref py py-meth docutils literal notranslate\">assertContains()</code></a> and\n<a class=\"reference internal\" href=\"/en/dev/topics/testing/tools/#django.test.SimpleTestCase.assertNotContains\" title=\"django.test.SimpleTestCase.assertNotContains\"><code class=\"xref py py-meth docutils literal notranslate\">assertNotContains()</code></a> can now be called\nmultiple times on the same <a class=\"reference internal\" href=\"/en/dev/ref/request-response/#django.http.StreamingHttpResponse\" title=\"django.http.StreamingHttpResponse\"><code class=\"xref py py-class docutils literal notranslate\">StreamingHttpResponse</code></a>.\nPreviously, they would consume the streaming response’s content, causing\nsubsequent calls to fail.</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><a class=\"reference internal\" href=\"/en/dev/ref/utils/#django.utils.dateparse.parse_duration\" title=\"django.utils.dateparse.parse_duration\"><code class=\"xref py py-func docutils literal notranslate\">parse_duration()</code></a> now supports ISO 8601\ntime periods expressed in weeks (<code class=\"docutils literal notranslate\">PnW</code>).</p></li>\n</ul>\n</section>\n</section>\n</section>\n<section id=\"backwards-incompatible-changes-in-6-1\">\n<span id=\"backwards-incompatible-6-1\"></span><h2>Backwards incompatible changes in 6.1<a class=\"heading-anchor\" href=\"#backwards-incompatible-changes-in-6-1\"><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 <code class=\"docutils literal notranslate\">DatabaseOperations.adapt_durationfield_value()</code> hook is added. If the\ndatabase has native support for <code class=\"docutils literal notranslate\">DurationField</code>, override this method to\nsimply return the value.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">DatabaseIntrospection.get_relations()</code> should now return a dictionary\nwith 3-tuples containing (<code class=\"docutils literal notranslate\">field_name_other_table</code>, <code class=\"docutils literal notranslate\">other_table</code>,\n<code class=\"docutils literal notranslate\">db_on_delete</code>) as values. <code class=\"docutils literal notranslate\">db_on_delete</code> is one of the database-level\ndelete options e.g. <a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.DB_CASCADE\" title=\"django.db.models.DB_CASCADE\"><code class=\"xref py py-attr docutils literal notranslate\">DB_CASCADE</code></a>.</p></li>\n<li><p>Set the new <code class=\"docutils literal notranslate\">DatabaseFeatures.supports_inspectdb</code> attribute to <code class=\"docutils literal notranslate\">False</code>\nif the management command isn’t supported.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">DatabaseFeatures.prohibits_dollar_signs_in_column_aliases</code> feature\nflag is removed.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">DatabaseOperations.binary_placeholder_sql()</code> method now expects a\nquery compiler as an extra positional argument and should return a\ntwo-elements tuple composed of an SQL format string and a tuple of associated\nparameters.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">BaseSpatialOperations.get_geom_placeholder()</code> method is renamed to\n<code class=\"docutils literal notranslate\">get_geom_placeholder_sql</code> and is expected to return a two-elements tuple\ncomposed of an SQL format string and a tuple of associated parameters.</p></li>\n<li><p>Set the new <code class=\"docutils literal notranslate\">DatabaseFeatures.supports_bit_aggregations</code> attribute to\n<code class=\"docutils literal notranslate\">False</code> if the database doesn’t support bitwise aggregations.</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>The <code class=\"docutils literal notranslate\">wide</code> class is removed, as it was made obsolete by the new layout.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">object-tools</code> block is hoisted out of the <code class=\"docutils literal notranslate\">content</code> block in forms.</p></li>\n<li><p>The undocumented <code class=\"docutils literal notranslate\">InclusionAdminNode.__init__()</code> now takes the template tag\n<code class=\"docutils literal notranslate\">name</code> as the first positional argument.</p></li>\n<li><p>The undocumented <code class=\"docutils literal notranslate\">ChangeList.has_related_field_in_list_display()</code> method\nhas been replaced with <code class=\"docutils literal notranslate\">ChangeList.get_select_related_fields()</code>.</p></li>\n</ul>\n</section>\n<section id=\"id2\">\n<h3><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=\"#id2\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<ul class=\"simple\">\n<li><p>Under ASGI, <a class=\"reference internal\" href=\"/en/dev/ref/middleware/#django.contrib.auth.middleware.RemoteUserMiddleware\" title=\"django.contrib.auth.middleware.RemoteUserMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">RemoteUserMiddleware</code></a> no\nlonger prefixes <code class=\"docutils literal notranslate\">HTTP_</code> when looking up custom values in <code class=\"docutils literal notranslate\">request.META</code>.\nFor example, to send <code class=\"docutils literal notranslate\">-H &quot;AuthUser: ...&quot;</code>, the <code class=\"docutils literal notranslate\">header</code> attribute should\nbe <code class=\"docutils literal notranslate\">HTTP_AUTHUSER</code>. This restores the behavior prior to Django 5.2. (The\ndefault value of <code class=\"docutils literal notranslate\">REMOTE_USER</code> is not affected.)</p></li>\n</ul>\n</section>\n<section id=\"id3\">\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=\"#id3\"><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 3.1 is removed.</p></li>\n<li><p>Support for GEOS 3.8 and 3.9 is removed.</p></li>\n<li><p>Support for GDAL 3.1 and 3.2 is removed.</p></li>\n</ul>\n</section>\n<section id=\"id4\">\n<h3><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=\"#id4\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<ul class=\"simple\">\n<li><p>Top-level elements set to <code class=\"docutils literal notranslate\">None</code> in an\n<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> with a\n<a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\">JSONField</code></a> base field are now saved as SQL <code class=\"docutils literal notranslate\">NULL</code>\ninstead of the JSON <code class=\"docutils literal notranslate\">null</code> primitive. This matches the behavior of a\nstandalone <a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\">JSONField</code></a> when storing <code class=\"docutils literal notranslate\">None</code> values.</p></li>\n</ul>\n</section>\n<section id=\"id5\">\n<h3>Email<a class=\"heading-anchor\" href=\"#id5\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<ul class=\"simple\">\n<li><p>Providing <code class=\"docutils literal notranslate\">fail_silently=True</code>, <code class=\"docutils literal notranslate\">auth_user</code>, or <code class=\"docutils literal notranslate\">auth_password</code> to mail\nsending functions (such as <a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.send_mail\" title=\"django.core.mail.send_mail\"><code class=\"xref py py-func docutils literal notranslate\">send_mail()</code></a>) while also\nproviding a <code class=\"docutils literal notranslate\">connection</code> now raises a <code class=\"docutils literal notranslate\">TypeError</code>.</p></li>\n<li><p>The undocumented <code class=\"docutils literal notranslate\">EmailMessage.get_connection()</code> method is no longer used.\nDefining it in a subclass or trying to call it now causes an error.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.EmailMessage.send\" title=\"django.core.mail.EmailMessage.send\"><code class=\"xref py py-meth docutils literal notranslate\">EmailMessage.send()</code></a> no longer sets the <code class=\"docutils literal notranslate\">connection</code> property on the\n<code class=\"docutils literal notranslate\">EmailMessage</code>. (This behavior was never documented. The <code class=\"docutils literal notranslate\">send()</code> method\nwill still <em>use</em> a <code class=\"docutils literal notranslate\">connection</code> that is set on the message before sending.)</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.EmailMessage.message\" title=\"django.core.mail.EmailMessage.message\"><code class=\"xref py py-meth docutils literal notranslate\">EmailMessage.message()</code></a> now raises a <code class=\"docutils literal notranslate\">ValueError</code> if <code class=\"docutils literal notranslate\">Bcc</code> is\nincluded in the <code class=\"docutils literal notranslate\">headers</code> argument or <code class=\"docutils literal notranslate\">extra_headers</code> attribute. Use the\n<code class=\"docutils literal notranslate\">bcc</code> argument instead.</p></li>\n</ul>\n</section>\n<section id=\"id6\">\n<h3>Models<a class=\"heading-anchor\" href=\"#id6\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<ul class=\"simple\">\n<li><p>The <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#std-fieldlookup-iexact\"><code class=\"xref std std-lookup docutils literal notranslate\">iexact=None</code></a> lookup on\n<a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\">JSONField</code></a> key transforms now matches JSON\n<code class=\"docutils literal notranslate\">null</code>, to match the behavior of <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#std-fieldlookup-exact\"><code class=\"xref std std-lookup docutils literal notranslate\">exact=None</code></a> on key\ntransforms. Previously, it was interpreted as an <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#std-fieldlookup-isnull\"><code class=\"xref std std-lookup docutils literal notranslate\">isnull</code></a> lookup.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.first\" title=\"django.db.models.query.QuerySet.first\"><code class=\"xref py py-meth docutils literal notranslate\">first()</code></a> and <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.last\" title=\"django.db.models.query.QuerySet.last\"><code class=\"xref py py-meth docutils literal notranslate\">last()</code></a> no longer order by the\nprimary key when a <code class=\"docutils literal notranslate\">QuerySet</code>’s ordering has been forcibly cleared by\ncalling <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\">order_by()</code></a> with no arguments.</p></li>\n<li><p>As default model ordering is now applied to combined querysets,\n<a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.union\" title=\"django.db.models.query.QuerySet.union\"><code class=\"xref py py-meth docutils literal notranslate\">union()</code></a>, <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.difference\" title=\"django.db.models.query.QuerySet.difference\"><code class=\"xref py py-meth docutils literal notranslate\">difference()</code></a>, and\n<a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.intersection\" title=\"django.db.models.query.QuerySet.intersection\"><code class=\"xref py py-meth docutils literal notranslate\">intersection()</code></a> raise <code class=\"docutils literal notranslate\">DatabaseError</code> when a field in\n<a class=\"reference internal\" href=\"/en/dev/ref/models/options/#django.db.models.Options.ordering\" title=\"django.db.models.Options.ordering\"><code class=\"xref py py-attr docutils literal notranslate\">Options.ordering</code></a> isn’t selected by <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\">values()</code></a> or\n<a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values_list\" title=\"django.db.models.query.QuerySet.values_list\"><code class=\"xref py py-meth docutils literal notranslate\">values_list()</code></a>. Call <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\">order_by()</code></a> without\narguments after combining to clear the default ordering.</p></li>\n<li><p>SQL <code class=\"docutils literal notranslate\">SELECT</code> aliases originating from <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.annotate()</code></a>\ncalls as well as table and <code class=\"docutils literal notranslate\">JOIN</code> aliases are now systematically quoted to\nprevent special character collisions. Because quoted aliases are\ncase-sensitive, <em>raw</em> SQL references to aliases mixing case, such as when\nusing <a class=\"reference internal\" href=\"/en/dev/ref/models/expressions/#django.db.models.expressions.RawSQL\" title=\"django.db.models.expressions.RawSQL\"><code class=\"xref py py-class docutils literal notranslate\">RawSQL</code></a>, might have to be adjusted to also make use of\nquoting.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/models/instances/#django.db.models.Model._is_pk_set\" title=\"django.db.models.Model._is_pk_set\"><code class=\"xref py py-meth docutils literal notranslate\">_is_pk_set()</code></a> now returns <code class=\"docutils literal notranslate\">False</code> for\n<code class=\"docutils literal notranslate\">DatabaseDefault</code> values on unsaved instances.</p></li>\n<li><p><code class=\"docutils literal notranslate\">fetch_mode=None</code> is added to the signature of\n<a class=\"reference internal\" href=\"/en/dev/ref/models/instances/#django.db.models.Model.from_db\" title=\"django.db.models.Model.from_db\"><code class=\"xref py py-meth docutils literal notranslate\">from_db()</code></a>.</p></li>\n</ul>\n</section>\n<section id=\"system-checks\">\n<h3>System checks<a class=\"heading-anchor\" href=\"#system-checks\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<ul class=\"simple\">\n<li><p>The <a class=\"reference internal\" href=\"/en/dev/ref/django-admin/#django-admin-check\"><code class=\"xref std std-djadmin docutils literal notranslate\">check</code></a> management command now supplies all <code class=\"docutils literal notranslate\">databases</code> if not\nspecified. Callers should be prepared for databases to be accessed.</p></li>\n</ul>\n</section>\n<section id=\"dropped-support-for-postgresql-14\">\n<h3>Dropped support for PostgreSQL 14<a class=\"heading-anchor\" href=\"#dropped-support-for-postgresql-14\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Upstream support for PostgreSQL 14 ends in November 2026. Django 6.1 supports\nPostgreSQL 15 and higher.</p>\n</section>\n<section id=\"dropped-support-for-mysql-8-4\">\n<h3>Dropped support for MySQL &lt; 8.4<a class=\"heading-anchor\" href=\"#dropped-support-for-mysql-8-4\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Upstream support for MySQL 8.0 ends in April 2026, and MySQL 8.1-8.3 are\nshort-term innovation releases. Django 6.1 supports MySQL 8.4 and higher.</p>\n</section>\n<section id=\"dropped-support-for-mariadb-10-11\">\n<h3>Dropped support for MariaDB &lt; 10.11<a class=\"heading-anchor\" href=\"#dropped-support-for-mariadb-10-11\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Upstream support for MariaDB 10.6 ends in July 2026, and MariaDB 10.7-10.10 are\nshort-term maintenance releases. Django 6.1 supports MariaDB 10.11 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 class=\"simple\">\n<li><p>The minimum supported version of SQLite is increased from 3.31.0 to 3.37.0.</p></li>\n<li><p>The default value of the transitional setting\n<a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-SIGNED_COOKIE_LEGACY_SALT_FALLBACK\"><code class=\"xref std std-setting docutils literal notranslate\">SIGNED_COOKIE_LEGACY_SALT_FALLBACK</code></a> is now <code class=\"docutils literal notranslate\">False</code>.</p></li>\n<li><p>In cases where cached pages or template fragments varied on arguments, e.g.\n<a class=\"reference internal\" href=\"/en/dev/topics/cache/#using-vary-headers\"><span class=\"std std-ref\">vary headers</span></a> for\n<a class=\"reference internal\" href=\"/en/dev/topics/cache/#django.views.decorators.cache.cache_page\" title=\"django.views.decorators.cache.cache_page\"><code class=\"xref py py-func docutils literal notranslate\">cache_page()</code></a> and\n<a class=\"reference internal\" href=\"/en/dev/ref/middleware/#django.middleware.cache.UpdateCacheMiddleware\" title=\"django.middleware.cache.UpdateCacheMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">UpdateCacheMiddleware</code></a>, or the <code class=\"docutils literal notranslate\">vary_on</code>\narguments to the <a class=\"reference internal\" href=\"/en/dev/topics/cache/#std-templatetag-cache\"><code class=\"xref std std-ttag docutils literal notranslate\">cache</code></a> template tag (generated by\n<a class=\"reference internal\" href=\"/en/dev/topics/cache/#django.core.cache.utils.make_template_fragment_key\" title=\"django.core.cache.utils.make_template_fragment_key\"><code class=\"xref py py-func docutils literal notranslate\">make_template_fragment_key()</code></a>), the cache keys\nare different from the keys generated by older versions of Django. After\nupgrading to Django 6.1, the first request to any previously cached page or\ntemplate fragment that varies on additional information will be a cache miss.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericForeignKey\" title=\"django.contrib.contenttypes.fields.GenericForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">GenericForeignKey</code></a> now uses a\nseparate descriptor class: the private <code class=\"docutils literal notranslate\">GenericForeignKeyDescriptor</code>.</p></li>\n<li><p>The undocumented <code class=\"docutils literal notranslate\">django.template.library.parse_bits()</code> function no longer\naccepts the <code class=\"docutils literal notranslate\">takes_context</code> argument.</p></li>\n<li><p>The <a class=\"reference internal\" href=\"/en/dev/ref/files/file/#django.core.files.File\" title=\"django.core.files.File\"><code class=\"xref py py-class docutils literal notranslate\">File</code></a> class now always evaluates to <code class=\"docutils literal notranslate\">True</code>\nin boolean contexts, rather than relying on the <code class=\"docutils literal notranslate\">name</code> attribute. The\nbuilt-in subclasses <code class=\"docutils literal notranslate\">FieldFile</code>, <code class=\"docutils literal notranslate\">UploadedFile</code>,\n<code class=\"docutils literal notranslate\">TemporaryUploadedFile</code>, <code class=\"docutils literal notranslate\">InMemoryUploadedFile</code>, and\n<code class=\"docutils literal notranslate\">SimpleUploadedFile</code> retain the previous behavior of evaluating based on\nthe <code class=\"docutils literal notranslate\">name</code> attribute.</p></li>\n<li><p>The undocumented <code class=\"docutils literal notranslate\">connection()</code> method of <a class=\"reference internal\" href=\"/en/dev/ref/logging/#django.utils.log.AdminEmailHandler\" title=\"django.utils.log.AdminEmailHandler\"><code class=\"xref py py-class docutils literal notranslate\">log.AdminEmailHandler</code></a>\nhas been removed and is no longer called. Subclasses overriding\n<a class=\"reference internal\" href=\"/en/dev/ref/logging/#django.utils.log.AdminEmailHandler.send_mail\" title=\"django.utils.log.AdminEmailHandler.send_mail\"><code class=\"xref py py-meth docutils literal notranslate\">AdminEmailHandler.send_mail()</code></a> should avoid calling <code class=\"docutils literal notranslate\">connection()</code>.\nSee <a class=\"reference internal\" href=\"/en/dev/howto/mailers-migration/#migrating-to-mailers-get-connection\"><span class=\"std std-ref\">Replacing get_connection() and connection arguments</span></a> if specific connection\nconfiguration is needed.</p></li>\n<li><p>The internal implementation of <a class=\"reference internal\" href=\"/en/dev/ref/middleware/#django.middleware.common.BrokenLinkEmailsMiddleware\" title=\"django.middleware.common.BrokenLinkEmailsMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">BrokenLinkEmailsMiddleware</code></a> has been\nupdated for mailers. If you have subclassed it to customize email sending\nbehavior (as suggested in <a class=\"reference internal\" href=\"/en/dev/howto/error-reporting/\"><span class=\"doc\">How to manage error reporting</span></a>), you may want to\nreview the updates in the base <a class=\"reference internal\" href=\"/en/dev/ref/middleware/#django.middleware.common.BrokenLinkEmailsMiddleware\" title=\"django.middleware.common.BrokenLinkEmailsMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">BrokenLinkEmailsMiddleware</code></a> class.</p></li>\n<li><p><code class=\"docutils literal notranslate\">django.http.multipartparser.MultiPartParser</code> now uses strict Base64\nvalidation when decoding encoded request data. Previously, invalid data could\nbe silently ignored or result in empty values. Invalid data now raises\n<code class=\"docutils literal notranslate\">MultiPartParserError</code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\">django.core.cache.backends.db.DatabaseCache</code> now uses strict Base64\nvalidation when decoding cached values. Invalid Base64 data will raise an\nexception instead of being silently ignored. Cache values generated by Django\nare unaffected, as they are always valid Base64. However, existing cache\nentries containing non-standard or corrupted Base64 data may no longer be\nreadable.</p></li>\n</ul>\n</section>\n</section>\n<section id=\"features-deprecated-in-6-1\">\n<span id=\"deprecated-features-6-1\"></span><h2>Features deprecated in 6.1<a class=\"heading-anchor\" href=\"#features-deprecated-in-6-1\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"mailers-deprecations\">\n<span id=\"id7\"></span><h3>Email<a class=\"heading-anchor\" href=\"#mailers-deprecations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<ul class=\"simple\">\n<li><p>The <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-EMAIL_BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\">EMAIL_BACKEND</code></a>, <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-EMAIL_FILE_PATH\"><code class=\"xref std std-setting docutils literal notranslate\">EMAIL_FILE_PATH</code></a>,\n<a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-EMAIL_HOST\"><code class=\"xref std std-setting docutils literal notranslate\">EMAIL_HOST</code></a>, <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-EMAIL_HOST_PASSWORD\"><code class=\"xref std std-setting docutils literal notranslate\">EMAIL_HOST_PASSWORD</code></a>,\n<a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-EMAIL_HOST_USER\"><code class=\"xref std std-setting docutils literal notranslate\">EMAIL_HOST_USER</code></a>, <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-EMAIL_PORT\"><code class=\"xref std std-setting docutils literal notranslate\">EMAIL_PORT</code></a>,\n<a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-EMAIL_USE_TLS\"><code class=\"xref std std-setting docutils literal notranslate\">EMAIL_USE_TLS</code></a>, <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-EMAIL_USE_SSL\"><code class=\"xref std std-setting docutils literal notranslate\">EMAIL_USE_SSL</code></a>,\n<a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-EMAIL_SSL_CERTFILE\"><code class=\"xref std std-setting docutils literal notranslate\">EMAIL_SSL_CERTFILE</code></a>, <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-EMAIL_SSL_KEYFILE\"><code class=\"xref std std-setting docutils literal notranslate\">EMAIL_SSL_KEYFILE</code></a>, and\n<a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-EMAIL_TIMEOUT\"><code class=\"xref std std-setting docutils literal notranslate\">EMAIL_TIMEOUT</code></a> settings are deprecated. Replace them with a\n<a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-MAILERS\"><code class=\"xref std std-setting docutils literal notranslate\">MAILERS</code></a> configuration dictionary as described in\n<a class=\"reference internal\" href=\"/en/dev/howto/mailers-migration/#migrating-to-mailers\"><span class=\"std std-ref\">Migrating email to mailers</span></a>.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.get_connection\" title=\"django.core.mail.get_connection\"><code class=\"xref py py-func docutils literal notranslate\">mail.get_connection()</code></a> is deprecated. See\n<a class=\"reference internal\" href=\"/en/dev/howto/mailers-migration/#migrating-to-mailers-get-connection\"><span class=\"std std-ref\">Replacing get_connection() and connection arguments</span></a> for replacement options.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">connection</code> argument to <a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.send_mail\" title=\"django.core.mail.send_mail\"><code class=\"xref py py-func docutils literal notranslate\">send_mail()</code></a>, <a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.send_mass_mail\" title=\"django.core.mail.send_mass_mail\"><code class=\"xref py py-func docutils literal notranslate\">send_mass_mail()</code></a>,\n<a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.mail_admins\" title=\"django.core.mail.mail_admins\"><code class=\"xref py py-func docutils literal notranslate\">mail_admins()</code></a>, <a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.mail_managers\" title=\"django.core.mail.mail_managers\"><code class=\"xref py py-func docutils literal notranslate\">mail_managers()</code></a>, and <a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.EmailMessage\" title=\"django.core.mail.EmailMessage\"><code class=\"xref py py-class docutils literal notranslate\">EmailMessage</code></a> is\ndeprecated. The <code class=\"docutils literal notranslate\">EmailMessage.connection</code> attribute is also deprecated.\nSwitch to the <code class=\"docutils literal notranslate\">using</code> argument with a <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-MAILERS\"><code class=\"xref std std-setting docutils literal notranslate\">MAILERS</code></a> alias.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">fail_silently</code> argument to <a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.send_mail\" title=\"django.core.mail.send_mail\"><code class=\"xref py py-func docutils literal notranslate\">send_mail()</code></a>,\n<a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.send_mass_mail\" title=\"django.core.mail.send_mass_mail\"><code class=\"xref py py-func docutils literal notranslate\">send_mass_mail()</code></a>, <a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.mail_admins\" title=\"django.core.mail.mail_admins\"><code class=\"xref py py-func docutils literal notranslate\">mail_admins()</code></a>, <a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.mail_managers\" title=\"django.core.mail.mail_managers\"><code class=\"xref py py-func docutils literal notranslate\">mail_managers()</code></a>, and\n<a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.EmailMessage.send\" title=\"django.core.mail.EmailMessage.send\"><code class=\"xref py py-meth docutils literal notranslate\">EmailMessage.send()</code></a> is deprecated. See\n<a class=\"reference internal\" href=\"/en/dev/howto/mailers-migration/#migrating-to-mailers-fail-silently\"><span class=\"std std-ref\">Replacing fail_silently</span></a> for alternatives.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">auth_user</code> and <code class=\"docutils literal notranslate\">auth_password</code> arguments to <a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.send_mail\" title=\"django.core.mail.send_mail\"><code class=\"xref py py-func docutils literal notranslate\">send_mail()</code></a> and\n<a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.send_mass_mail\" title=\"django.core.mail.send_mass_mail\"><code class=\"xref py py-func docutils literal notranslate\">send_mass_mail()</code></a> are deprecated. Replace them with <code class=\"docutils literal notranslate\">&quot;username&quot;</code> and\n<code class=\"docutils literal notranslate\">&quot;password&quot;</code> <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-MAILERS-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\">OPTIONS</code></a> in <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-MAILERS\"><code class=\"xref std std-setting docutils literal notranslate\">MAILERS</code></a>.\nSee <a class=\"reference internal\" href=\"/en/dev/howto/mailers-migration/#migrating-to-mailers-auth\"><span class=\"std std-ref\">Replacing auth_user and auth_password</span></a>.</p></li>\n<li><p>Directly constructing and using instances of the\n<a class=\"reference internal\" href=\"/en/dev/topics/email/#topic-email-smtp-backend\"><span class=\"std std-ref\">smtp.EmailBackend</span></a> class is deprecated. Use\n<a class=\"reference internal\" href=\"/en/dev/topics/email/#django.core.mail.mailers\" title=\"django.core.mail.mailers\"><code class=\"xref py py-data docutils literal notranslate\">mail.mailers</code></a> to obtain email backend instances.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">BaseEmailBackend.__init__()</code> constructor no longer silently ignores\nunknown keyword arguments. Custom email backend subclasses should ensure they\nhave consumed all supported <code class=\"docutils literal notranslate\">**kwargs</code> before forwarding the remainder to\nsuperclass init. The base class now issues a deprecation warning for unknown\narguments, and it will treat them as errors starting in Django 2028. See\n<a class=\"reference internal\" href=\"/en/dev/howto/mailers-migration/#migrating-to-mailers-email-backends\"><span class=\"std std-ref\">Migrating custom email backends</span></a>.</p></li>\n<li><p>Support for <code class=\"docutils literal notranslate\">fail_silently</code> in the <code class=\"docutils literal notranslate\">BaseEmailBackend</code> is deprecated.\nA custom email backend that wants to support <code class=\"docutils literal notranslate\">fail_silently</code> should manage\nits own local attribute, not pass it to the base backend constructor. See\n<a class=\"reference internal\" href=\"/en/dev/howto/mailers-migration/#migrating-to-mailers-email-backends\"><span class=\"std std-ref\">Migrating custom email backends</span></a>.</p></li>\n</ul>\n</section>\n<section id=\"id8\">\n<h3>Miscellaneous<a class=\"heading-anchor\" href=\"#id8\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<ul class=\"simple\">\n<li><p>Calling <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\">select_related()</code></a> with no\narguments to select all non-nullable related fields is deprecated. Specify\nthe related fields to fetch instead, or use the\n<a class=\"reference internal\" href=\"/en/dev/topics/db/fetch-modes/#django.db.models.FETCH_PEERS\" title=\"django.db.models.FETCH_PEERS\"><code class=\"xref py py-attr docutils literal notranslate\">FETCH_PEERS</code></a> fetch mode.</p></li>\n<li><p>Setting <a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_select_related\" title=\"django.contrib.admin.ModelAdmin.list_select_related\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.list_select_related</code></a> to <code class=\"docutils literal notranslate\">True</code> and returning\n<code class=\"docutils literal notranslate\">True</code> from <a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_list_select_related\" title=\"django.contrib.admin.ModelAdmin.get_list_select_related\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.get_list_select_related()</code></a> are deprecated.\nSpecify the related fields to fetch instead.</p></li>\n<li><p>Calling <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values_list\" title=\"django.db.models.query.QuerySet.values_list\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.values_list()</code></a> with <code class=\"docutils literal notranslate\">flat=True</code> and no field name\nis deprecated. Pass an explicit field name, like\n<code class=\"docutils literal notranslate\">values_list(&quot;pk&quot;, flat=True)</code>.</p></li>\n<li><p>Support for <code class=\"docutils literal notranslate\">Model.from_db()</code> methods that do not accept the\n<code class=\"docutils literal notranslate\">fetch_mode</code> keyword argument is deprecated.</p></li>\n<li><p>The use of <code class=\"docutils literal notranslate\">None</code> to represent a top-level JSON scalar <code class=\"docutils literal notranslate\">null</code> when\nquerying <a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\">JSONField</code></a> is now deprecated in favor of\nthe new <a class=\"reference internal\" href=\"/en/dev/ref/models/expressions/#django.db.models.JSONNull\" title=\"django.db.models.JSONNull\"><code class=\"xref py py-class docutils literal notranslate\">JSONNull</code></a> expression. At the end of the\ndeprecation period, <code class=\"docutils literal notranslate\">None</code> values compile to SQL <code class=\"docutils literal notranslate\">IS NULL</code> when used as\nthe top-level value. <a class=\"reference internal\" href=\"/en/dev/topics/db/queries/#std-fieldlookup-jsonfield.key\"><code class=\"xref std std-lookup docutils literal notranslate\">Key and index lookups</code></a> are\nunaffected by this deprecation.</p></li>\n<li><p>The undocumented <code class=\"docutils literal notranslate\">django.db.models.fields.BLANK_CHOICE_DASH</code> constant is\ndeprecated. See the <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-USE_BLANK_CHOICE_DASH\"><code class=\"xref std std-setting docutils literal notranslate\">USE_BLANK_CHOICE_DASH</code></a> transitional setting for\nmigration advice.</p></li>\n<li><p>The <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-USE_BLANK_CHOICE_DASH\"><code class=\"xref std std-setting docutils literal notranslate\">USE_BLANK_CHOICE_DASH</code></a> transitional setting is deprecated.</p></li>\n<li><p>The <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-SIGNED_COOKIE_LEGACY_SALT_FALLBACK\"><code class=\"xref std std-setting docutils literal notranslate\">SIGNED_COOKIE_LEGACY_SALT_FALLBACK</code></a> transitional setting is\ndeprecated.</p></li>\n<li><p>The undocumented <code class=\"docutils literal notranslate\">get_placeholder</code> method of\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> is deprecated in favor of the newly\nintroduced <code class=\"docutils literal notranslate\">get_placeholder_sql</code> method, which has the same input signature\nbut is expected to return a two-elements tuple composed of an SQL format\nstring and a tuple of associated parameters. This method should now expect\nto be provided expressions meant to be compiled via the provided <code class=\"docutils literal notranslate\">compiler</code>\nargument.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">quote_name_unless_alias()</code> method of <code class=\"docutils literal notranslate\">SQLCompiler</code>, the type of\nobject passed as the <code class=\"docutils literal notranslate\">compiler</code> argument to the <code class=\"docutils literal notranslate\">as_sql()</code> method of\n<a class=\"reference internal\" href=\"/en/dev/ref/models/expressions/#writing-your-own-query-expressions\"><span class=\"std std-ref\">expressions</span></a>, is deprecated in\nfavor of the newly introduced <code class=\"docutils literal notranslate\">quote_name()</code> method.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">email_backend</code> argument of <a class=\"reference internal\" href=\"/en/dev/ref/logging/#django.utils.log.AdminEmailHandler\" title=\"django.utils.log.AdminEmailHandler\"><code class=\"xref py py-class docutils literal notranslate\">log.AdminEmailHandler</code></a> is\ndeprecated in favor of the newly introduced <code class=\"docutils literal notranslate\">using</code> argument.\nSee <a class=\"reference internal\" href=\"/en/dev/howto/mailers-migration/#migrating-to-mailers-adminemailhandler\"><span class=\"std std-ref\">Updating AdminEmailHandler email_backend</span></a> for details.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">BitAnd</code>, <code class=\"docutils literal notranslate\">BitOr</code>, and <code class=\"docutils literal notranslate\">BitXor</code> classes in\n<code class=\"docutils literal notranslate\">django.contrib.postgres.aggregates</code> are deprecated in favor of the\ngenerally available <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.BitAnd\" title=\"django.db.models.BitAnd\"><code class=\"xref py py-class docutils literal notranslate\">BitAnd</code></a>,\n<a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.BitOr\" title=\"django.db.models.BitOr\"><code class=\"xref py py-class docutils literal notranslate\">BitOr</code></a>, and <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.BitXor\" title=\"django.db.models.BitXor\"><code class=\"xref py py-class docutils literal notranslate\">BitXor</code></a>\nclasses.</p></li>\n<li><p>Support for double-dot variable lookups, like <code class=\"docutils literal notranslate\">{{ book..title }}</code>, is\ndeprecated. This syntax maps to a lookup of the empty string, which is\nnormally a mistake.</p></li>\n<li><p>The default value of the <code class=\"docutils literal notranslate\">algorithm</code> argument for\n<code class=\"docutils literal notranslate\">django.utils.crypto.salted_hmac()</code> and\n<code class=\"docutils literal notranslate\">django.core.signing.base64_hmac()</code> is deprecated and will change from\n<code class=\"docutils literal notranslate\">&quot;sha1&quot;</code> to <code class=\"docutils literal notranslate\">&quot;sha256&quot;</code> in Django 2028. Pass an explicit <code class=\"docutils literal notranslate\">algorithm</code>\nto silence the deprecation warning.</p></li>\n<li><p>Overriding <code class=\"docutils literal notranslate\">ModelAdmin.get_actions()</code> without the new <code class=\"docutils literal notranslate\">action_location</code>\nparameter is deprecated.</p></li>\n<li><p>Unpacking or indexing the dictionary values of the\n<code class=\"docutils literal notranslate\">ModelAdmin.get_actions()</code> return value is deprecated. Use\n<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-class docutils literal notranslate\">Action</code></a> attributes instead.</p></li>\n<li><p>Overriding <code class=\"docutils literal notranslate\">ModelAdmin.get_action_choices()</code> without the new\n<code class=\"docutils literal notranslate\">action_location</code> parameter is deprecated.</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/dev/topics/db/transactions/#django.db.transaction.savepoint\" title=\"django.db.transaction.savepoint\"><code class=\"xref py py-func docutils literal notranslate\">django.db.transaction.savepoint()</code></a> is deprecated in favor of\n<a class=\"reference internal\" href=\"/en/dev/topics/db/transactions/#django.db.transaction.savepoint_create\" title=\"django.db.transaction.savepoint_create\"><code class=\"xref py py-func docutils literal notranslate\">savepoint_create()</code></a>.</p></li>\n</ul>\n</section>\n</section>\n<section id=\"features-removed-in-6-1\">\n<h2>Features removed in 6.1<a class=\"heading-anchor\" href=\"#features-removed-in-6-1\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>These features have reached the end of their deprecation cycle and are removed\nin Django 6.1.</p>\n<p>See <a class=\"reference internal\" href=\"/en/dev/releases/5.2/#deprecated-features-5-2\"><span class=\"std std-ref\">Features deprecated in 5.2</span></a> for details on these changes, including how\nto remove usage of these features.</p>\n<ul class=\"simple\">\n<li><p>The <code class=\"docutils literal notranslate\">all</code> parameter for the <code class=\"docutils literal notranslate\">django.contrib.staticfiles.finders.find()</code>\nfunction is removed in favor of the <code class=\"docutils literal notranslate\">find_all</code> parameter.</p></li>\n<li><p>Fallbacks to <code class=\"docutils literal notranslate\">request.user</code> and <code class=\"docutils literal notranslate\">request.auser()</code> when <code class=\"docutils literal notranslate\">user</code> is\n<code class=\"docutils literal notranslate\">None</code> in <code class=\"docutils literal notranslate\">django.contrib.auth.login()</code> and\n<code class=\"docutils literal notranslate\">django.contrib.auth.alogin()</code>, respectively, are removed.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\">ordering</code> keyword parameter of the PostgreSQL specific aggregation\nfunctions <code class=\"docutils literal notranslate\">django.contrib.postgres.aggregates.ArrayAgg</code>,\n<code class=\"docutils literal notranslate\">django.contrib.postgres.aggregates.JSONBAgg</code>, and\n<code class=\"docutils literal notranslate\">django.contrib.postgres.aggregates.StringAgg</code> are removed in favor\nof the <code class=\"docutils literal notranslate\">order_by</code> parameter.</p></li>\n<li><p>Support for subclasses of <code class=\"docutils literal notranslate\">RemoteUserMiddleware</code> that override\n<code class=\"docutils literal notranslate\">process_request()</code> without overriding <code class=\"docutils literal notranslate\">aprocess_request()</code> is\nremoved.</p></li>\n</ul>\n</section>","rootId":"django-6-1-release-notes","toc":[{"title":"Python compatibility","anchor":"python-compatibility","children":[]},{"title":"What’s new in Django 6.1","anchor":"what-s-new-in-django-6-1","children":[{"title":"Model field fetch modes","anchor":"model-field-fetch-modes","children":[]},{"title":"Database-level delete options for ForeignKey.on_delete","anchor":"database-level-delete-options-for-foreignkey-on-delete","children":[]},{"title":"Mailers","anchor":"mailers","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.gis","anchor":"django-contrib-gis","children":[]},{"title":"django.contrib.postgres","anchor":"django-contrib-postgres","children":[]},{"title":"django.contrib.sessions","anchor":"django-contrib-sessions","children":[]},{"title":"CSP","anchor":"csp","children":[]},{"title":"Email","anchor":"email","children":[]},{"title":"Forms","anchor":"forms","children":[]},{"title":"Generic Views","anchor":"generic-views","children":[]},{"title":"Management Commands","anchor":"management-commands","children":[]},{"title":"Models","anchor":"models","children":[]},{"title":"Requests and Responses","anchor":"requests-and-responses","children":[]},{"title":"Security","anchor":"security","children":[]},{"title":"Serialization","anchor":"serialization","children":[]},{"title":"Tasks","anchor":"tasks","children":[]},{"title":"Tests","anchor":"tests","children":[]},{"title":"Utilities","anchor":"utilities","children":[]}]}]},{"title":"Backwards incompatible changes in 6.1","anchor":"backwards-incompatible-changes-in-6-1","children":[{"title":"Database backend API","anchor":"database-backend-api","children":[]},{"title":"django.contrib.admin","anchor":"id1","children":[]},{"title":"django.contrib.auth","anchor":"id2","children":[]},{"title":"django.contrib.gis","anchor":"id3","children":[]},{"title":"django.contrib.postgres","anchor":"id4","children":[]},{"title":"Email","anchor":"id5","children":[]},{"title":"Models","anchor":"id6","children":[]},{"title":"System checks","anchor":"system-checks","children":[]},{"title":"Dropped support for PostgreSQL 14","anchor":"dropped-support-for-postgresql-14","children":[]},{"title":"Dropped support for MySQL < 8.4","anchor":"dropped-support-for-mysql-8-4","children":[]},{"title":"Dropped support for MariaDB < 10.11","anchor":"dropped-support-for-mariadb-10-11","children":[]},{"title":"Miscellaneous","anchor":"miscellaneous","children":[]}]},{"title":"Features deprecated in 6.1","anchor":"features-deprecated-in-6-1","children":[{"title":"Email","anchor":"mailers-deprecations","children":[]},{"title":"Miscellaneous","anchor":"id8","children":[]}]},{"title":"Features removed in 6.1","anchor":"features-removed-in-6-1","children":[]}],"breadcrumbs":[{"docname":"releases/index","title":"Release notes","url":"/en/dev/releases/"}],"prev":{"docname":"releases/6.1.1","title":"Django 6.1.1 release notes","url":"/en/dev/releases/6.1.1/"},"next":{"docname":"releases/6.0.9","title":"Django 6.0.9 release notes","url":"/en/dev/releases/6.0.9/"},"formats":{"html":"/en/dev/releases/6.1/","markdown":"/en/dev/releases/6.1.md","json":"/en/dev/releases/6.1.json"},"source":"https://github.com/django/django/blob/main/docs/releases/6.1.txt","official":"https://docs.djangoproject.com/en/dev/releases/6.1/","inVersions":["dev","6.1"],"inLocales":["en"]}