Menos consultas
Parte da seção Models e o Admin do Journey de Django da Coddy. Lição 19 de 23.
A página inicial exibe o autor de cada livro, e isso tem um custo: uma consulta busca os livros, e então {{ book.author.name }} executa mais uma consulta para cada livro. Dez livros, onze consultas; mil livros, mil e uma. Esse é o problema N+1, um motivo comum para uma página do Django ficar lenta.
select_related() resolve isso: o ORM busca a linha relacionada na mesma consulta, com um JOIN SQL. Uma página de empréstimos que exibe o título do livro de cada empréstimo faria:
loans = Loan.objects.select_related("book")Você informa o nome do campo ForeignKey, aquele que acessa como loan.book, e ele continua encadeável com filter() e order_by(). Ele segue ForeignKeys apenas no sentido direto. Para os livros de um autor e para campos muitos-para-muitos, você precisa de prefetch_related(), usado no projeto Authors. Depois disso, a página fica igual, mas com menos consultas.
Desafio
MédioEm books/views.py, faça com que os conjuntos de consultas em home e search busquem o autor de cada livro na mesma consulta. Mantenha o filtro de pesquisa.
Pressione “Executar”: as páginas ficam iguais. As verificações adicionam dez livros e permitem duas consultas por página.
Experimente você mesmo
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})
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Models e o Admin
Pratique por conta própria: Playground de Django