A página de autores
Parte da seção Models e o Admin do Journey de Django da Coddy. Lição 22 de 23.
Sua estante tem uma página para cada livro, mas nenhuma para os autores. Este projeto cria uma página com base no que você sabe: uma view que consulta o banco de dados, uma URL, um template que acompanha as relações e um QuerySet que não executa uma consulta por linha.
Cada autor é listado com seus livros: um loop pelos autores e, dentro dele, um loop pelos livros de cada autor. Sem ajuda, o loop interno executa uma consulta por autor. select_related() não pode ajudar, porque a relação entre um autor e seus livros é reversa. Seu parceiro, prefetch_related(), busca as linhas relacionadas de cada objeto da lista com apenas uma consulta adicional. Book.objects.prefetch_related("loans") busca os empréstimos de todos os livros em uma consulta adicional. Ele recebe o nome da relação.
A tarefa especifica o que a página deve fazer; o código é com você.
Desafio
MédioCrie uma página de autores.
- Em
books/views.py, escrevaauthor_list: renderizebooks/author_list.htmlcom todos os autores, usandoprefetch_related(). - Em
books/urls.py, adicioneauthors/com o nomeauthors. - Em
author_list.html, coloque cada autor em uma<section class="author">: o nome em um<h2>e um<li>para cada livro, com o título vinculado à página do livro. - Em
books/base.html, adicione um link paraAuthorsno<header>.
Clique em Authors: Herbert lista Children of Dune e Dune.
Experimente você mesmo
from django.shortcuts import get_object_or_404, render
from .models import Book
def home(request):
books = Book.objects.select_related("author")
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).select_related("author")
return render(request, "books/search.html", {"q": q, "books": books})
Todas as lições de Models e o Admin
Pratique por conta própria: Playground de Django