Django Academy · Lektion

Identifiera N+1-problemet

Känn igen den klassiska fällan med en fråga per rad

Lektion 1 av 413 steg

Identifiera N+1-problemet är en gratis lektion i Django Academy på CoddyKit. Detta är lektion 1 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Django Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Django Academy innehåller totalt 4 lektioner.

Vad N+1 betyder

N+1-problemet uppstår när koden kör en fråga för att hämta en lista och sedan ytterligare en fråga för varje objekt i listan. 🐢

Var det döljer sig

Det döljer sig vanligtvis i en loop över objekt, där varje varv i bakgrunden hämtar en relaterad rad från databasen igen.

Ett litet exempel

Föreställ Er att Ni listar böcker och skriver ut varje författare. Loopen nedan ser oskyldig ut men kör en ny fråga på varje rad.

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

Räkna frågorna

En fråga läser in alla böcker. Sedan kör varje åtkomst till book.author sin egen fråga, så 100 böcker innebär 101 resor till databasen.

Varför 1 och sedan N

Det är där namnet kommer ifrån: 1 fråga för listan med överordnade objekt plus N extra frågor, en för varje relaterat objekt Ni använder.

Lazy loading är orsaken

Django läser in relaterade rader lazily, först när Ni efterfrågar dem. Det är praktiskt för ett objekt men kostsamt när det sker i en loop.

Det skalar dåligt

Problemet växer med datamängden. Tio rader känns hanterbart, men tiotusen rader förvandlar en sidinläsning till en flod av frågor.

Mallar kan också utlösa det

En mall som skriver ut relaterade data i en for-loop orsakar exakt samma storm, även om Ni inte ser någon Python-loop.

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

Så upptäcker Ni det

Var uppmärksam på åtkomst till ett relaterat objekt, som obj.parent, inuti en loop. Det mönstret är alltid en varningssignal.

Gör frågorna synliga

Ni kan räkna frågorna direkt med connection.queries under DEBUG, vilket visar hur många resor till databasen en vy faktiskt gör.

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

Den goda nyheten

När Ni kan se problemet ger Django Er två verktyg som kan slå ihop alla dessa frågor till bara några få. Ni möter dem härnäst. 🚀

Snabb kontroll

Låt oss säkerställa att N+1-mönstret är tydligt.

Sammanfattning

N+1-problemet är en fråga för listan plus en för varje relaterat objekt, orsakat av lazy loading inuti loopar. Upptäck det genom att leta efter åtkomst till relaterade objekt i en loop. ✅

Gratis att börja

Lär dig Python med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
30
Lektioner
120

Vanliga frågor

Är lektionen ”Identifiera N+1-problemet” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Django Academy, inklusive ”Identifiera N+1-problemet”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Django Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Identifiera N+1-problemet”?

Känn igen den klassiska fällan med en fråga per rad Ni övar på Django Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Django Academy?

Du behöver inga förkunskaper. Utbildningen i Django Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.

Hur lång tid tar lektionen ”Identifiera N+1-problemet”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Django Academy-lektionen?

Ja. Varje Django Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Identifiera N+1-problemet
  2. select_related för Foreign Keys
  3. prefetch_related för M2M
  4. Profilering med Debug Toolbar
← Tillbaka till Django Academy