Django Academy · レッスン

related_nameと逆引き

両方向から関連をたどります

レッスン 4/413 ステップ

「related_nameと逆引き」はCoddyKit上の無料Django Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDjango Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Django Academyコースには全4レッスンが含まれています。

関連は両方向にたどれる

本から著者への ForeignKey を設定しても、逆方向にたどることができます。reverse lookupを使うと、1側から多側にアクセスできます。

デフォルトの _set manager

Django はデフォルトで、逆方向のアクセサーにmodelname_setという名前を付けます。著者から見ると、本は book_set として現れます。

author = Author.objects.first()
author.book_set.all()

_set は manager

book_set は完全なmanagerなので、通常のクエリと同じように filter、order_by、count をつなげて使えます。

author.book_set.filter(published=True).count()

related_name で名前を付ける

_set という名前は扱いにくいものです。ForeignKey にrelated_nameを設定すると、逆方向のアクセサーにわかりやすい名前を自分で付けられます。

author = models.ForeignKey(Author, related_name="books", on_delete=models.CASCADE)

よりわかりやすい逆方向アクセス

これで逆方向のアクセスが自然になります。book_set の代わりにbooksと書くだけでよく、はるかに読みやすくなります。

author.books.all()

クエリで逆方向にたどる

related_name は、関連をまたいだfilterにも使われます。もう一方のモデルから、double underscore と選択した名前を使います。

Author.objects.filter(books__published=True)

デフォルトのクエリ名

related_name を省略すると、逆方向のクエリ名は小文字のモデル名になります。たとえば author.objects.filter(book__title=...) のように記述します。

名前の衝突を避ける

同じモデルから同じ対象への ForeignKey が2つあると、逆方向の名前が衝突します。それぞれに異なるrelated_nameを設定すれば解決できます。

writer = models.ForeignKey(User, related_name="written", on_delete=models.CASCADE)
editor = models.ForeignKey(User, related_name="edited", on_delete=models.CASCADE)

逆方向のアクセスを無効にする

related_name に+で終わる値を設定すると、逆方向のアクセサーを完全に無効にできます。必要のない場合に使用します。

owner = models.ForeignKey(User, related_name="+", on_delete=models.CASCADE)

related_query_name

related_query_nameを使うと、名前を分けられます。関連する行を読み取る属性とは別に、filter で使う名前を設定できます。

tags = models.ManyToManyField(Tag, related_name="posts", related_query_name="post")

すべての関連で使える

related_name はForeignKey、ManyToManyField、OneToOneField のすべてに適用できます。そのため、どの逆方向の経路にもわかりやすい名前を付けられます。

理解度チェック

Book の author ForeignKey に related_name="books" を設定しました。著者の本を一覧表示するにはどうしますか?

まとめ

できました!reverse lookup を使うと関連を逆方向にたどれます。また、related_nameによって、扱いにくい _set アクセサーを明確で読みやすい名前に変更できます。🔄

無料で開始

AI チューターと学ぶ Python — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
30
レッスン
120

よくある質問

「related_nameと逆引き」レッスンは無料ですか?

はい。「related_nameと逆引き」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Django Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Django Academyコースには全4レッスンが含まれています。

「related_nameと逆引き」で何を学びますか?

両方向から関連をたどります ブラウザで直接実行するハンズオンコードでDjango Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Django Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのDjango Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「related_nameと逆引き」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このDjango Academyレッスンでコードを書いて実行できますか?

はい。すべてのDjango Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ForeignKeyとon_delete
  2. ManyToManyFieldとThrough Models
  3. Profiles用のOneToOneField
  4. related_nameと逆引き
← Django Academyに戻る