Weniger Abfragen
Teil des Abschnitts Modelle und Admin-Bereich der Django-Journey von Coddy. Lektion 19 von 23.
Die Startseite gibt den Autor jedes Buchs aus, und das hat seinen Preis: Eine Abfrage ruft die Bücher ab, dann führt {{ book.author.name }} für jedes Buch eine weitere Abfrage aus. Zehn Bücher, elf Abfragen; tausend Bücher, eintausendundeine. Das ist das N+1-Problem, ein häufiger Grund dafür, dass eine Django-Seite langsam ist.
select_related() behebt das: Das ORM ruft den zugehörigen Datensatz in derselben Abfrage mit einem SQL-JOIN ab. Eine Seite mit Ausleihen, die den Buchtitel jeder Ausleihe ausgibt, würde Folgendes abfragen:
loans = Loan.objects.select_related("book")Du gibst den Namen des ForeignKey-Felds an, auf das du mit loan.book zugreifst, und kannst weiterhin filter() und order_by() verketten. Es folgt ForeignKeys nur vorwärts; für den Rückweg und Many-to-many-Felder verwendest du prefetch_related(), das du im Authors-Projekt kennenlernst. Danach sieht die Seite genauso aus, benötigt aber weniger Abfragen.
Aufgabe
MittelSowohl die Startseite als auch die Suchseite zeigen den Autor jedes Buches an. Sorge dafür, dass bei beiden die Autoren zusammen mit den Büchern abgerufen werden, sodass die Anzahl der Abfragen unabhängig davon, wie viele Bücher es gibt, gleich bleibt:
- die Ansicht
home - die Ansicht
search
Klicke auf „Run“: Die Seiten sehen gleich aus. Die Tests zählen die Abfragen.
Probier es selbst
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})
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Modelle und Admin-Bereich
Übe selbstständig: Django-Playground