Menu
CoddyTech

Moins de requêtes

Fait partie de la section Modèles et interface d’administration du Journey Django de Coddy. Leçon 19 sur 23.

La page d’accueil affiche l’auteur de chaque livre, et cela a un coût : une requête récupère les livres, puis {{ book.author.name }} exécute une requête supplémentaire par livre. Dix livres, onze requêtes ; mille livres, mille et une. C’est le problème N+1, une raison fréquente pour laquelle une page Django est lente.

select_related() résout ce problème : l’ORM récupère la ligne associée dans la même requête, avec une jointure SQL. Une page de prêts qui affiche le titre du livre de chaque prêt aurait besoin de :

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

Tu lui donnes le nom du champ ForeignKey, celui que tu lis sous la forme loan.book, et tu peux toujours enchaîner avec filter() et order_by(). Il suit uniquement les ForeignKeys dans le sens direct ; pour remonter dans l’autre sens et pour les champs many-to-many, on utilise prefetch_related(), étudié dans le projet Authors. La page reste identique après ce changement, avec moins de requêtes.

challenge icon

Défi

Moyen

La page d’accueil et la page de recherche affichent toutes deux l’auteur de chaque livre. Faites en sorte que chacune récupère les auteurs en même temps que les livres, afin que le nombre de requêtes reste le même quel que soit le nombre de livres :

  • la vue home
  • la vue search

Appuyez sur Exécuter : les pages restent identiques. Les vérifications comptent les requêtes.

Essayez vous-même

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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Modèles et interface d’administration

Entraînez-vous par vous-même : Playground Django