Mniej zapytań
Część sekcji Modele i panel administracyjny ścieżki Django w Coddy. Lekcja 19 z 23.
Strona główna wyświetla autora każdej książki, a to ma swoją cenę: jedno zapytanie pobiera książki, a następnie {{ book.author.name }} wykonuje jeszcze jedno zapytanie dla każdej książki. Dziesięć książek — jedenaście zapytań; tysiąc książek — tysiąc i jedno. To problem N+1, częsta przyczyna powolnego działania strony Django.
select_related() rozwiązuje ten problem: ORM pobiera powiązany wiersz w tym samym zapytaniu, używając SQL JOIN. Strona z wypożyczeniami, która wyświetla tytuł książki dla każdego wypożyczenia, wykonałaby:
loans = Loan.objects.select_related("book")Podajesz jej nazwę pola ForeignKey, które odczytujesz jako loan.book, a metoda nadal łączy się z filter() i order_by(). Podąża tylko w przód przez klucze ForeignKey. W przypadku książek danego autora i pól wiele-do-wielu potrzebujesz prefetch_related(), użytego w projekcie Authors. Strona wygląda potem tak samo, ale wykonuje mniej zapytań.
Wyzwanie
ŚredniW pliku books/views.py spraw, by zestawy zapytań w home i search pobierały autora każdej książki w ramach tego samego zapytania. Zachowaj filtr wyszukiwania.
Naciśnij „Uruchom”: strony wyglądają tak samo. Testy dodają dziesięć książek i dopuszczają dwa zapytania na stronę.
Spróbuj swoich sił
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})
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Modele i panel administracyjny
Poćwicz samodzielnie: Edytor online Django