Vue d'ensemble

Django 2.2, publié le 1er avril 2019, est une version LTS (Long Term Support) qui recevra des correctifs de sécurité pendant trois ans. Sa nouveauté principale est l'introduction des contraintes de base de données (CheckConstraint et UniqueConstraint) directement dans les modèles Django. Cette version ajoute également le drapeau --database à plusieurs commandes de gestion.

Fonctionnalités principales

Contraintes de base de données

L'option Meta.constraints permet de déclarer des contraintes directement dans le modèle. CheckConstraint valide une condition au niveau de la base de données, tandis que UniqueConstraint offre plus de souplesse que unique_together en supportant des conditions et des colonnes d'inclusion.

python
from django.db import models
from django.db.models import Q, CheckConstraint, UniqueConstraint

class Reservation(models.Model):
    salle = models.CharField(max_length=50)
    date = models.DateField()
    heure_debut = models.TimeField()
    heure_fin = models.TimeField()
    nb_personnes = models.PositiveIntegerField()

    class Meta:
        constraints = [
            # L'heure de fin doit être après l'heure de début
            CheckConstraint(
                check=Q(heure_fin__gt=models.F('heure_debut')),
                name='reservation_heure_fin_apres_debut',
            ),
            # Au moins 1 personne par réservation
            CheckConstraint(
                check=Q(nb_personnes__gte=1),
                name='reservation_nb_personnes_min',
            ),
            # Une seule réservation par salle, date et créneau
            UniqueConstraint(
                fields=['salle', 'date', 'heure_debut'],
                name='reservation_unique_creneau',
            ),
        ]

Drapeau --database

Les commandes migrate, showmigrations et d'autres commandes de gestion acceptent désormais le drapeau --database pour cibler une base de données spécifique. C'est essentiel pour les projets multi-bases qui utilisent des routeurs de bases de données.

python
# Appliquer les migrations uniquement sur la base 'analytics'
# python manage.py migrate --database=analytics

# Voir l'état des migrations sur la base 'legacy'
# python manage.py showmigrations --database=legacy

# Créer un dump de la base 'analytics'
# python manage.py dumpdata --database=analytics > analytics.json

# Exemple de configuration multi-bases
# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'app_principale',
    },
    'analytics': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'app_analytics',
    },
}

Sources