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

challenge icon

Wyzwanie

Średni

Zaró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})
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