Vue d'ensemble
Django 3.2, publié le 6 avril 2021, est une version LTS (Long Term Support). Son changement le plus impactant est le réglage DEFAULT_AUTO_FIELD, qui permet de configurer le type de clé primaire auto-générée pour les nouveaux modèles. Par défaut, Django utilisait AutoField (entier 32 bits) ; il est désormais recommandé d'utiliser BigAutoField (entier 64 bits). Cette version introduit également les index fonctionnels et le support de pymemcache.
Fonctionnalités principales
DEFAULT_AUTO_FIELD
Le réglage DEFAULT_AUTO_FIELD contrôle le type de clé primaire utilisé par défaut lorsqu'un modèle ne définit pas explicitement de champ primaire. Ce changement évite les problèmes de dépassement de capacité sur les tables à fort volume.
# settings.py
# Nouveau défaut recommandé pour les nouveaux projets
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
# Pour un projet existant, on peut configurer par application
# dans apps.py
from django.apps import AppConfig
class CatalogueConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'catalogue'
# Ou directement dans le modèle
from django.db import models
class Transaction(models.Model):
# BigAutoField explicite pour les tables volumineuses
id = models.BigAutoField(primary_key=True)
montant = models.DecimalField(max_digits=10, decimal_places=2)
date = models.DateTimeField(auto_now_add=True)
# BigAutoField supporte jusqu'à 9 223 372 036 854 775 807
# contre 2 147 483 647 pour AutoField
Index fonctionnels
L'option Meta.indexes accepte désormais des expressions comme arguments, permettant de créer des index sur des colonnes calculées ou des fonctions de base de données. C'est particulièrement utile pour optimiser les requêtes qui filtrent sur des transformations de données.
from django.db import models
from django.db.models import Index
from django.db.models.functions import Lower, ExtractYear
class Article(models.Model):
titre = models.CharField(max_length=200)
auteur = models.CharField(max_length=100)
date_publication = models.DateField()
est_publie = models.BooleanField(default=False)
class Meta:
indexes = [
# Index sur le titre en minuscules
# Optimise : Article.objects.filter(titre__iexact='...')
Index(
Lower('titre'),
name='article_titre_lower_idx',
),
# Index sur l'année de publication
# Optimise : Article.objects.filter(
# date_publication__year=2024
# )
Index(
ExtractYear('date_publication'),
name='article_annee_pub_idx',
),
# Index conditionnel (partiel)
Index(
'date_publication',
name='article_publie_date_idx',
condition=models.Q(est_publie=True),
),
]
Support de pymemcache
Django 3.2 ajoute un backend de cache basé sur pymemcache, une bibliothèque Memcached plus moderne et activement maintenue, en remplacement du vieillissant python-memcached.
# settings.py
CACHES = {
'default': {
# Nouveau backend pymemcache
'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
'LOCATION': '127.0.0.1:11211',
'OPTIONS': {
'no_delay': True,
'connect_timeout': 2,
'timeout': 5,
},
}
}
# Utilisation du cache dans une vue
from django.core.cache import cache
def statistiques(request):
stats = cache.get('stats_globales')
if stats is None:
stats = calculer_statistiques() # opération coûteuse
cache.set('stats_globales', stats, timeout=300)
return render(request, 'statistiques.html', {'stats': stats})
