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 }} lance 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 courante 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 demanderait :

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

Indique-lui 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(). Cette méthode suit uniquement les ForeignKey dans le sens direct. Pour les livres d’un auteur et pour les champs many-to-many, tu as besoin de prefetch_related(), utilisé dans le projet Authors. Ensuite, la page a le même aspect, avec moins de requêtes.

challenge icon

Défi

Moyen

Dans books/views.py, faites en sorte que les QuerySets dans home et search récupèrent l’auteur de chaque livre dans la même requête. Conservez le filtre de recherche.

Cliquez sur « Jouer » : les pages ont le même aspect. Les vérifications ajoutent dix livres et autorisent deux requêtes par page.

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