Vue d'ensemble

Django 1.4, publié le 23 mars 2012, apporte le support natif des fuseaux horaires et la méthode bulk_create pour les insertions massives. C'est également la première version de Django à bénéficier d'un support à long terme (LTS), garantissant des correctifs de sécurité pendant au moins trois ans.

Fonctionnalités principales

Support des fuseaux horaires

Avec USE_TZ = True, Django stocke toutes les dates en UTC dans la base de données et les convertit automatiquement dans le fuseau horaire de l'utilisateur lors de l'affichage. Cela élimine une classe entière de bugs liés aux décalages horaires.

python
# settings.py
USE_TZ = True
TIME_ZONE = 'Europe/Paris'

# Toujours utiliser timezone.now() au lieu de datetime.now()
from django.utils import timezone

class Evenement(models.Model):
    titre = models.CharField(max_length=200)
    debut = models.DateTimeField()
    fin = models.DateTimeField()

# Création avec date UTC
evenement = Evenement.objects.create(
    titre="Conférence Python",
    debut=timezone.now(),
    fin=timezone.now() + timezone.timedelta(hours=2),
)

# Dans un template, la date est convertie automatiquement
# {% load tz %}
# {% timezone "Europe/Paris" %}
#     {{ evenement.debut }}
# {% endtimezone %}

bulk_create pour les insertions massives

La méthode bulk_create permet d'insérer de nombreux objets en une seule requête SQL, ce qui est considérablement plus rapide que de créer les objets un par un.

python
import random

# Avant bulk_create : une requête INSERT par objet (lent)
# for i in range(1000):
#     Mesure.objects.create(valeur=random.uniform(0, 100))

# Avec bulk_create : une seule requête INSERT (rapide)
mesures = [
    Mesure(valeur=random.uniform(0, 100), capteur_id=1)
    for _ in range(1000)
]
Mesure.objects.bulk_create(mesures)

# Pour de très grands volumes, utiliser batch_size
gros_lot = [
    Mesure(valeur=random.uniform(0, 100), capteur_id=2)
    for _ in range(50000)
]
Mesure.objects.bulk_create(gros_lot, batch_size=5000)

Nouvelle structure de projet

Django 1.4 réorganise la structure par défaut des projets créés avec startproject. Le fichier manage.py est maintenant à la racine du projet, et les fichiers de configuration sont regroupés dans un sous-répertoire portant le nom du projet.

python
# Ancienne structure (Django < 1.4)
# monprojet/
#     __init__.py
#     manage.py
#     settings.py
#     urls.py

# Nouvelle structure (Django >= 1.4)
# monprojet/
#     manage.py
#     monprojet/
#         __init__.py
#         settings.py
#         urls.py
#         wsgi.py

Sources