Django 6.1 est sorti
par Makersquad ·
Date de sortie : 5 août 2026
Documentation officielle : Django 6.1 release notes
Django 6.1 est sorti le 5 août 2026. Cette version prend en charge Python 3.12, 3.13 et 3.14, et prend en charge 3.15 depuis la 6.1.3, sortie le 3 novembre 2026. Elle apporte un contrôle fin du chargement des champs, des suppressions déléguées à la base et une nouvelle configuration des e-mails.
Les nouveautés principales
Modes de récupération des champs
La récupération à la demande d’un champ non chargé devient configurable. Trois modes existent :
FETCH_ONE(par défaut) : ne charge le champ que pour l’instance courante, comme avant.FETCH_PEERS: charge le champ pour toutes les instances issues du mêmeQuerySet, à la manière d’unprefetch_related()à la demande.FETCH_RAISE: lèveFieldFetchBlocked, pratique pour traquer les requêtes involontaires.
from django.db import models
books = Book.objects.fetch_mode(models.FETCH_PEERS)
for book in books:
print(book.author.name)
Avec FETCH_PEERS, cette boucle n’exécute que deux requêtes : une pour les livres, une pour les auteurs.
Suppression gérée par la base
ForeignKey.on_delete accepte trois nouvelles options qui s’appuient sur la clause SQL ON DELETE : DB_CASCADE, DB_SET_NULL et DB_SET_DEFAULT. Django ne charge plus les objets avant de les supprimer, ce qui est plus efficace. En contrepartie, DB_CASCADE ne déclenche ni pre_delete ni post_delete.
Le réglage MAILERS
Le nouveau réglage MAILERS configure plusieurs backends d’e-mail avec leurs propres options.
MAILERS = {
"default": {
"BACKEND": "django.core.mail.backends.smtp.EmailBackend",
"OPTIONS": {"host": "smtp.example.com", "use_tls": True},
},
"marketing": {
"BACKEND": "example.third.party.EmailBackend",
"OPTIONS": {"region": "africa-1"},
},
}
On choisit un mailer avec le nouvel argument using des fonctions d’envoi, ou avec mail.mailers[alias]. MAILERS n’est pas activé par défaut. Il remplacera EMAIL_BACKEND et les réglages EMAIL_* dans Django 2028, qui sont dès maintenant dépréciés, tout comme mail.get_connection().
Autres nouveautés
- Admin : la vue de connexion redirige vers
nextpour un utilisateur déjà authentifié,action()gagne les argumentslocationetdescription_plural, etdelete_confirmation_max_displaytronque les longues listes d’objets. - Authentification : les itérations PBKDF2 par défaut passent de 1 200 000 à 1 500 000.
- CSP : nouvelle balise de gabarit
csp_nonce_attret nouvelle vérificationsecurity.W027. - Modèles : expression
JSONNull, fonctionsUUID4etUUID7,QuerySet.totally_ordered, et agrégatsBitAnd,BitOretBitXordésormais disponibles hors PostgreSQL. - Tâches :
task()accepte des**kwargstransmis à latask_classdu backend, etTaskcommeTaskResultsont sérialisables avec pickle.
Changements incompatibles
Les notes listent de nombreux changements incompatibles. Les plus susceptibles de toucher un projet :
- Support abandonné pour PostgreSQL 14 (PostgreSQL 15 minimum), MySQL antérieur à 8.4, MariaDB antérieur à 10.11 et SQLite antérieur à 3.37.0.
- Les alias
SELECT, de tables et deJOINsont désormais toujours cités. Comme les alias cités respectent la casse, le SQL brut (RawSQL) qui référence des alias à casse mixte peut demander un ajustement. union(),difference()etintersection()lèventDatabaseErrorquand un champ deOptions.orderingn’est pas sélectionné parvalues()ouvalues_list(). Appelezorder_by()sans argument après la combinaison.first()etlast()ne trient plus par clé primaire quand l’ordre duQuerySeta été effacé parorder_by()sans argument.- Envoi d’e-mails : fournir
fail_silently=True,auth_userouauth_passwordavec unconnectionlèveTypeError, etEmailMessage.message()lèveValueErrorsiBccfigure dans les en-têtes (utiliser l’argumentbcc). - Sous ASGI,
RemoteUserMiddlewarene préfixe plusHTTP_pour chercher des valeurs personnalisées dansrequest.META. - Les versions jusqu’ici prévues comme Django 7.0 et 7.1 deviennent Django 2028 et 2029 (versionnage calendaire). Les classes d’avertissement de dépréciation suivent :
RemovedInDjango70WarningdevientRemovedInDjango2028Warning, ce qui compte si vos filtres d’avertissements les nomment. - La valeur par défaut de
SIGNED_COOKIE_LEGACY_SALT_FALLBACKpasse àFalse: les cookies signés avec l’ancienne dérivation du sel sont refusés. Remettez-la àTruepour continuer à les accepter. - Les clés de cache qui varient selon des arguments (
cache_page(), balisecache) changent : la première requête après la mise à jour est un défaut de cache. - Une base64 invalide lève une erreur dans
MultiPartParseret dansDatabaseCache, au lieu d’être ignorée silencieusement. - Fonctionnalités retirées : paramètre
alldestaticfiles.finders.find()(remplacé parfind_all), paramètreorderingdes agrégats PostgreSQLArrayAgg,JSONBAggetStringAgg(remplacé parorder_by), replis surrequest.userdanslogin()etalogin().
Dépréciations à connaître
select_related()sans argument : préciser les champs ou utiliserFETCH_PEERS.values_list(flat=True)sans nom de champ : passer un champ explicite, par exemplevalues_list("pk", flat=True).Nonepour désigner unnullJSON de premier niveau dans les requêtesJSONField: utiliserJSONNull.transaction.savepoint(): utilisersavepoint_create().- Les doubles points dans les variables de gabarit (
{{ book..title }}).
À retenir
Django 6.1 rend le chargement des champs et la suppression plus maîtrisables, et prépare la sortie de EMAIL_BACKEND avec MAILERS. Avant de migrer, relisez les changements incompatibles, en particulier la citation des alias SQL, les bases de données minimales et les dépréciations qui disparaîtront avec Django 2028.