Django ORM: 7 Techniques Pour Optimiser Vos Requêtes SQL
Le problème N°1 en Django: les requêtes SQL inefficaces. Voici comment les résoudre.
Utilisez select_related() pour les ForeignKey
# ❌ N+1 Queries Problem
posts = Post.objects.all()
for post in posts:
print(post.author.name) # 1 + N requêtes!
# ✅ Une seule requête
posts = Post.objects.select_related('author')
Utilisez prefetch_related() pour les ManyToMany
# ❌ 1 + N requêtes
articles = Article.objects.all()
for article in articles:
print(article.tags.all())
# ✅ 2 requêtes
articles = Article.objects.prefetch_related('tags')
Filtrez Avant la Boucle
# ❌ Lent
users = User.objects.all()
actifs = [u for u in users if u.is_active]
# ✅ Rapide
actifs = User.objects.filter(is_active=True)
Utilisez only() et defer() pour les Gros Champs
# Ne charger que les champs nécessaires
users = User.objects.only('id', 'name')
# Ou exclure les gros champs
articles = Article.objects.defer('contenu_html')
Utilisez values() et values_list()
# Au lieu de charger les objets complets
users = User.objects.all() # Crée 1000 objets
# Chargez juste les données
emails = User.objects.values_list('email', flat=True)
Utilisez count() au lieu de len()
# ❌ Charge tous les objets
nombre = len(User.objects.all())
# ✅ Une requête COUNT
nombre = User.objects.count()
Utilisez bulk_create() pour les Insertions
# ❌ N requêtes INSERT
for nom in noms:
User.objects.create(name=nom)
# ✅ 1 requête INSERT
users = [User(name=nom) for nom in noms]
User.objects.bulk_create(users)
Benchmarking
Résultats avec 10 000 utilisateurs:
Sans optimisation: 2.5 secondes
Avec select_related: 0.3 secondes
Avec only(): 0.2 secondes
Itam
08 mars 2026 à 06:22