Django

Django ORM: 7 Techniques Pour Optimiser Vos Requêtes SQL

Default Cover
Auteur MEME
Date 06 mars 2026
Lecture 1 min
Vues 39

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

Connectez-vous pour participer à la discussion.

Se connecter

1 Commentaires

I
Itam
08 mars 2026 à 06:22
votre avis est important alors laisser un petit commentaire
Voir tous les articles