0Pricing
Django Academy · Lezione

Individuare il problema N+1

Riconoscere la classica trappola delle query ripetute per riga

Individuare il problema N+1 è una lezione Django Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Django Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Django Academy include 4 lezioni in totale.

Che cosa significa N+1

Il problema N+1 si verifica quando il codice esegue una query per ottenere un elenco e poi un'altra query per ogni elemento dell'elenco. 🐢

Dove si nasconde

Di solito si nasconde in un ciclo sugli oggetti, in cui ogni iterazione accede silenziosamente a una riga correlata del database, ancora e ancora.

Un piccolo esempio

Immagini di elencare i libri e stampare ogni autore. Il ciclo seguente sembra innocuo, ma avvia una nuova query a ogni riga.

for book in Book.objects.all():
    print(book.author.name)

Contare le query

Una query carica tutti i libri. Poi ogni accesso a book.author esegue una query propria, quindi 100 libri significano 101 trasferimenti al database.

Perché 1 e poi N

Da qui il nome: 1 query per l'elenco principale, più N query aggiuntive, una per ogni oggetto correlato a cui si accede.

Il caricamento differito è la causa

Django carica le righe correlate in modo differito, solo quando vengono richieste. È comodo per un oggetto, ma problematico quando lo si fa all'interno di un ciclo.

Scala male

Il problema cresce con i dati. Dieci righe sembrano gestibili, ma diecimila trasformano il caricamento di una pagina in un fiume di query.

Anche i template lo provocano

Un template che stampa dati correlati all'interno di un ciclo for provoca esattamente la stessa valanga, anche se non è visibile alcun ciclo Python.

{% for book in books %}
  {{ book.author.name }}
{% endfor %}

Come individuarlo

Cerchi l'accesso a un oggetto correlato, come obj.parent, all'interno di un ciclo. Questo schema è sempre un campanello d'allarme.

Rendere visibili le query

Durante il DEBUG è possibile contare direttamente le query con connection.queries, verificando quanti trasferimenti al database esegue realmente una vista.

from django.db import connection
print(len(connection.queries))

La buona notizia

Una volta individuato il problema, Django offre due strumenti per ridurre tutte quelle query a poche. Li conoscerà tra poco. 🚀

Verifica rapida

Assicuriamoci che il modello N+1 sia chiaro.

Riepilogo

Il problema N+1 consiste in una query per l'elenco più una per ogni oggetto correlato, a causa del caricamento differito all'interno dei cicli. Lo si individua cercando accessi a dati correlati dentro un ciclo. ✅

Domande Frequenti

La lezione «Individuare il problema N+1» è gratuita?

Sì — il testo completo di «Individuare il problema N+1» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Django Academy, passa a CoddyKit PRO. Il corso Django Academy include 4 lezioni in totale.

Cosa imparerò in «Individuare il problema N+1»?

Riconoscere la classica trappola delle query ripetute per riga Eserciti Django Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Django Academy?

Non è richiesta alcuna esperienza precedente. Django Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Individuare il problema N+1»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Django Academy?

Sì. Ogni lezione Django Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Individuare il problema N+1
  2. select_related per le chiavi esterne
  3. prefetch_related per M2M
  4. Profilazione con Debug Toolbar
← Torna a Django Academy