Menu
CoddyTech

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.

challenge icon

Desafio

Médio

A 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})
quiz iconTeste seus conhecimentos

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