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, depois {{ book.author.name }} executa mais uma consulta por 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 esta consulta:
loans = Loan.objects.select_related("book")Você informa o nome do campo ForeignKey, aquele que você acessa como loan.book, e ele continua funcionando em cadeia com filter() e order_by(). Ele segue ForeignKeys apenas no sentido direto; para voltar e para campos muitos-para-muitos, use prefetch_related(), apresentado no projeto Authors. Depois, a página fica com a mesma aparência, mas com menos consultas.
Desafio
MédioA página inicial e a página de pesquisa mostram ambas o autor de cada livro. Faça com que cada uma busque os autores junto com os livros, para que o número de consultas permaneça o mesmo, independentemente da quantidade de livros:
- a visualização
home - a visualização
search
Clique em Executar: as páginas ficam iguais. As verificações contam as consultas.
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