Vue d'ensemble

Django 1.7, publié le 2 septembre 2014, est une version majeure qui intègre un système de migrations de schéma directement dans le framework. Jusqu'à présent, les développeurs devaient utiliser la bibliothèque tierce South pour gérer les évolutions de la base de données. Django 1.7 rend cet outil natif avec les commandes makemigrations et migrate.

Fonctionnalités principales

Migrations intégrées

Le système de migrations détecte automatiquement les changements apportés aux modèles et génère des fichiers de migration. Ces fichiers sont versionnables et permettent de reproduire l'évolution du schéma sur n'importe quel environnement.

python
# Après avoir modifié un modèle :
# python manage.py makemigrations
# Migrations for 'catalogue':
#   catalogue/migrations/0002_produit_poids.py
#     - Add field poids to produit

# Appliquer les migrations :
# python manage.py migrate

# Exemple de fichier de migration généré
from django.db import migrations, models

class Migration(migrations.Migration):
    dependencies = [
        ('catalogue', '0001_initial'),
    ]

    operations = [
        migrations.AddField(
            model_name='produit',
            name='poids',
            field=models.DecimalField(
                max_digits=6, decimal_places=2, null=True
            ),
        ),
    ]

Registre d'applications

Le nouveau registre d'applications (AppConfig) offre un point d'entrée propre pour la configuration de chaque application Django. Il permet de définir des noms lisibles, d'exécuter du code d'initialisation au démarrage et de connecter des signaux de manière fiable.

python
# catalogue/apps.py
from django.apps import AppConfig

class CatalogueConfig(AppConfig):
    name = 'catalogue'
    verbose_name = 'Catalogue de produits'

    def ready(self):
        """Code exécuté au démarrage de l'application."""
        import catalogue.signaux  # noqa: F401

# catalogue/signaux.py
from django.db.models.signals import post_save
from django.dispatch import receiver
from catalogue.models import Produit

@receiver(post_save, sender=Produit)
def notifier_nouveau_produit(sender, instance, created, **kwargs):
    if created:
        print(f"Nouveau produit ajouté : {instance.nom}")

Sources