Menu
CoddyTech

関連する名前

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 %} と書くと、その本の貸し出しを一覧表示します。名前のつづりを間違えてもエラーは出ず、何も表示されません。そのため、一覧が空になったら、まず名前を確認しましょう。

challenge icon

チャレンジ

簡単

各書籍のページに、その著者のほかの書籍を一覧表示しましょう。

  1. books/models.pyで、Book.authorに関連名booksを設定し、author.books.all()がその著者のすべての書籍を返すようにします。
  2. 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 %}
quiz icon腕試し

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

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

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