Menu
CoddyTech

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ń.

challenge icon

Wyzwanie

Średni

W 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})
quiz iconSprawdź się

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