Menu
CoddyTech

Meno query

Fa parte della sezione Modelli e pannello di amministrazione del percorso Django di Coddy. Lezione 19 di 23.

La home page stampa l'autore di ogni libro, e questo ha un costo: una query recupera i libri, poi {{ book.author.name }} esegue un'altra query per ogni libro. Dieci libri, undici query; mille libri, mille e una. Questo è il problema N+1, una causa comune della lentezza di una pagina Django.

select_related() risolve il problema: l'ORM recupera la riga correlata nella stessa query, con una JOIN SQL. Una pagina di prestiti che stampa il titolo del libro di ogni prestito richiederebbe:

loans = Loan.objects.select_related("book")

Gli passi il nome del campo ForeignKey, quello che leggi come loan.book, e continua a concatenarsi con filter() e order_by(). Segue solo in avanti le ForeignKey; per la direzione inversa e i campi molti-a-molti si usa prefetch_related(), visto nel progetto Authors. In seguito la pagina appare uguale, ma con meno query.

challenge icon

Sfida

Medio

Sia la pagina iniziale che la pagina di ricerca mostrano l'autore di ogni libro. Fai in modo che entrambe recuperino gli autori insieme ai libri, così il numero di query rimane invariato indipendentemente da quanti libri ci siano:

  • la vista home
  • la vista search

Premi Run: le pagine appaiono uguali. I controlli contano le query.

Provalo tu

from django.shortcuts import get_object_or_404, render

from .models import Book


def home(request):
    books = Book.objects.all()
    return render(request, "books/home.html", {"books": books})


def book_detail(request, pk):
    book = get_object_or_404(Book, pk=pk)
    return render(request, "books/book_detail.html", {"book": book})


def search(request):
    q = request.GET.get("q", "")
    books = Book.objects.filter(title__icontains=q)
    return render(request, "books/search.html", {"q": q, "books": books})
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Modelli e pannello di amministrazione

Esercitati da solo: Playground Django