Menu
CoddyTech

著者ページ

CoddyのDjangoジャーニー「モデルと管理サイト」セクションの一部。レッスン 22/23。

本棚には本ごとのページがありますが、著者のページはありません。このプロジェクトでは、知っていることをもとにページを作成します。データベースを検索するビュー、URL、リレーションをたどるテンプレート、そして行ごとにクエリを実行しないQuerySetを用意します。

各著者の下に、その著者の本を一覧表示します。著者を順番に処理するループと、その中で各著者の本を順番に処理するループです。何もしなければ、内側のループは著者ごとに1つのクエリを実行します。著者からその本へは逆方向のリレーションなので、select_related()では解決できません。その対となるprefetch_related()は、リスト内のすべてのオブジェクトに関連する行を、追加のクエリ1つで取得します。

課題にはページが何をしなければならないかが書かれています。コードは自分で書きましょう。

challenge icon

チャレンジ

中級

/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プレイグラウンド