Repérer le problème N+1
Reconnaissez le piège classique d’une requête par ligne.
Repérer le problème N+1 est une leçon Django Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Django Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Django Academy comprend 4 leçons au total.
Certaines parties de cette leçon n'ont pas encore été traduites et s'affichent en anglais.
What N+1 Means
The N+1 problem is when your code runs one query to get a list, then one more query for each item in it. 🐢
Where It Hides
It usually hides in a loop over objects, where each pass quietly touches a related row in the database again and again.
A Tiny Example
Imagine listing books and printing each author. The loop below looks innocent but fires a fresh query on every line.
for book in Book.objects.all():
print(book.author.name)Counting the Queries
One query loads all books. Then each book.author access runs its own query, so 100 books means 101 trips to the database.
Why 1, Then N
That is the name: 1 query for the parent list, plus N extra queries, one per related object you touch.
Lazy Loading Is the Cause
Django loads related rows lazily, only when you ask. Convenient for one object, painful when you ask inside a loop.
It Scales Badly
The damage grows with your data. Ten rows feel fine, but ten thousand rows turn one page load into a flood of queries.
Templates Trigger It Too
A template that prints related data inside a for loop causes the exact same storm, even though no Python loop is visible to you.
{% for book in books %}
{{ book.author.name }}
{% endfor %}How to Spot It
Watch for a related-object access, like obj.parent, happening inside a loop. That pattern is the warning sign every time.
Make Queries Visible
You can count queries directly with connection.queries during DEBUG, which proves how many round trips a view really makes.
from django.db import connection
print(len(connection.queries))The Good News
Once you can see the problem, Django gives you two tools to collapse all those queries into just a few. You will meet them next. 🚀
Quick Check
Let us make sure the N+1 pattern is clear.
Recap
The N+1 problem is one list query plus one per related object, caused by lazy loading inside loops. Spot it by watching for related access in a loop. ✅
Questions Fréquemment Posées
La leçon « Repérer le problème N+1 » est-elle gratuite ?
Oui — le texte complet de « Repérer le problème N+1 » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Django Academy, passe à CoddyKit PRO. Le cours Django Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Repérer le problème N+1 » ?
Reconnaissez le piège classique d’une requête par ligne. Tu pratiques Django Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Django Academy ?
Aucune expérience préalable n'est requise. Django Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « Repérer le problème N+1 » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Django Academy ?
Oui. Chaque leçon Django Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Repérer le problème N+1
- select_related pour les clés étrangères
- prefetch_related pour les relations plusieurs-à-plusieurs
- Profilage avec la barre d’outils de débogage