関連する名前
CoddyのDjangoジャーニー「モデルと管理サイト」セクションの一部。レッスン 17/23。
本のページには、著者のほかの本を一覧表示できます。つまり、著者から本へ戻るということです。ForeignKey は両方向に機能します。Loan が本を指している場合、loan.book で順方向にたどれます。逆方向にたどるため、Django は Book にマネージャーを追加します。その名前はモデル名に _set を付けたものです。つまり、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 loan in book.loans.all %} と書くと、その本の貸し出しを一覧表示します。名前のつづりを間違えてもエラーは出ず、何も表示されません。そのため、一覧が空になったら、まず名前を確認しましょう。
チャレンジ
簡単各書籍のページに、その著者のほかの書籍を一覧表示しましょう。
books/models.pyで、Book.authorに関連名booksを設定し、author.books.all()がその著者のすべての書籍を返すようにします。book_detail.htmlで、「戻る」リンクの上に、<h2>を追加します。たとえばMore by Frank Herbertのようにし、さらに<ul class="more">を追加して、その著者のすべての書籍を、それぞれのページへのリンクとして一覧表示します。
「実行」を押してDuneをクリックします。「More by Frank Herbert」の下にChildren of DuneとDuneが表示されます。
自分で試してみよう
{% 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 %}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
モデルと管理サイトのすべてのレッスン
自分で練習してみよう: Djangoプレイグラウンド