Menu
CoddyTech

関連する名前

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

書籍のページには、著者のほかの書籍を一覧表示できます。つまり、著者から書籍へ戻る関係です。ForeignKey は双方向に機能します。書籍を参照する Loan がある場合、loan.book で前方向にたどれます。また Django は、モデル名に _set を付けた名前のマネージャーを Book に追加し、逆方向にたどれるようにします。たとえば book.loan_set.all() です。related_name を使うと、よりわかりやすい名前を付けられます。

book = models.ForeignKey(Book, on_delete=models.PROTECT, related_name="loans")

これで book.loans.all() はその書籍の貸出を返し、book.loans.count() は Loan.objects と同じように使えます。また、loan_set は存在しなくなります。

テンプレートではドットでリレーションをたどり、メソッドは括弧を付けずに呼び出します。{% for other in loan.book.loans.all %} は前方向にたどり、次に戻って同じ書籍のすべての貸出を取得します。名前のスペルを間違えてもエラーは表示されず、何も表示されません。そのため、一覧が空になったときは、まず名前を確認してください。

challenge icon

チャレンジ

簡単
  • Book.authorに逆引き名booksを設定します。
  • book_detail.htmlで、戻るリンクの上に、More by Frank Herbertのような<h2>と、その著者のすべての本をそれぞれのページへのリンクとして一覧表示する<ul class="more">を追加します。

「実行」を押して、本のページを開きます。

自分で試してみよう

{% extends "books/base.html" %}

{% block title %}{{ book.title }}{% endblock %}

{% block content %}
<h1>{{ book.title }}</h1>
<p class="author">by {{ book.author }}</p>
<ul>
    <li>Published in {{ book.year }}</li>
    <li>Genre: {{ book.get_genre_display }}</li>
    <li>Price: {{ book.price }}</li>
</ul>
<p><a href="{% url 'books:home' %}">Back to the shelf</a></p>
{% endblock %}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

モデルと管理サイトのすべてのレッスン

自分で練習してみよう: Djangoプレイグラウンド