著者ページ
CoddyのDjangoジャーニー「モデルと管理サイト」セクションの一部。レッスン 22/23。
本棚には本ごとのページがありますが、著者のページはありません。このプロジェクトでは、知っていることをもとにページを作成します。データベースを検索するビュー、URL、リレーションをたどるテンプレート、そして行ごとにクエリを実行しないQuerySetを用意します。
各著者の下に、その著者の本を一覧表示します。著者を順番に処理するループと、その中で各著者の本を順番に処理するループです。何もしなければ、内側のループは著者ごとに1つのクエリを実行します。著者からその本へは逆方向のリレーションなので、select_related()では解決できません。その対となるprefetch_related()は、リスト内のすべてのオブジェクトに関連する行を、追加のクエリ1つで取得します。
課題にはページが何をしなければならないかが書かれています。コードは自分で書きましょう。
チャレンジ
中級/authors/にAuthorsページを作成し、URL名をauthorsにします:
- 各著者について、名前を
<h2>に表示し、それぞれの本へのリンクを含む<section class="author">を作成します。 - 著者の人数にかかわらず、ページが実行するクエリの数は同じです。
books/base.htmlのヘッダーから、Authorsとしてリンクします。
Runを押して、Authorsをクリックします。
自分で試してみよう
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})
モデルと管理サイトのすべてのレッスン
自分で練習してみよう: Djangoプレイグラウンド