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 potem {{ 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, wymagałaby:
loans = Loan.objects.select_related("book")Podajesz nazwę pola ForeignKey, do którego odwołujesz się jako loan.book, a metoda nadal łączy się z filter() i order_by(). Podąża wyłącznie za kluczami obcymi w przód; do relacji wstecznych i pól wiele-do-wielu służy prefetch_related(), poznane w projekcie Authors. Po tej zmianie strona wygląda tak samo, ale wykonuje mniej zapytań.
Wyzwanie
ŚredniZarówno strona główna, jak i strona wyszukiwania pokazują autora każdej książki. Spraw, aby obie pobierały autorów razem z książkami, dzięki czemu liczba zapytań będzie taka sama niezależnie od liczby książek:
- widok
home - widok
search
Naciśnij Run: strony wyglądają tak samo. Testy sprawdzają liczbę zapytań.
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