Vue d'ensemble
Django 1.1, publié le 29 juillet 2009, enrichit le framework avec des fonctionnalités d'agrégation dans l'ORM et des tests transactionnels plus rapides. Cette version consolide les fondations posées par Django 1.0 en rendant les requêtes de base de données plus expressives.
Fonctionnalités principales
Agrégation dans l'ORM
Django 1.1 introduit le support des fonctions d'agrégation (Count, Sum, Avg, Max, Min) directement dans l'ORM, permettant des calculs complexes sans SQL brut.
from django.db.models import Count, Avg, Sum
# Nombre d'articles par auteur
auteurs_actifs = (
Auteur.objects
.annotate(nb_articles=Count('article'))
.filter(nb_articles__gt=0)
.order_by('-nb_articles')
)
for auteur in auteurs_actifs:
print(f"{auteur.nom} : {auteur.nb_articles} articles")
# Statistiques globales
stats = Article.objects.aggregate(
total=Count('id'),
moyenne_longueur=Avg('contenu__length'),
)
print(f"Total : {stats['total']}, Longueur moyenne : {stats['moyenne_longueur']:.0f}")
Tests transactionnels
La classe TransactionTestCase offre un contrôle fin sur les transactions dans les tests. Combinée avec TestCase qui utilise des transactions pour accélérer les tests, Django 1.1 rend la suite de tests significativement plus rapide.
from django.test import TestCase, TransactionTestCase
class ArticleTestCase(TestCase):
"""Les tests dans TestCase sont encapsulés dans une transaction.
La base de données est restaurée automatiquement après chaque test."""
def setUp(self):
self.auteur = Auteur.objects.create(
nom="Marie Dupont",
email="marie@exemple.fr",
)
def test_creation_article(self):
article = Article.objects.create(
titre="Mon article",
contenu="Le contenu.",
auteur=self.auteur,
)
self.assertEqual(article.auteur.nom, "Marie Dupont")
self.assertFalse(article.publie)
