Django での外部キーの逆引き参照

Vaibhav Vaibhav 2021年8月10日
Django での外部キーの逆引き参照

Django は、Web アプリケーションの作成を簡素化する効率的な Web 開発フレームワークです。Django を使用すると、認証と承認、HTML テンプレートの作成、静的ファイルの処理、データベースとのやり取り、およびそれらに対する CRUD 操作の実行を簡単に行うことができます。

データベースと言えば、Django はデータベースの操作中に行うことができるクエリのほとんどを簡素化します。そのようなクエリの 1つは、逆の外観です。例として、同じテーブルまたは異なるモデルの特定のレコードを参照しているテーブルのすべてのオブジェクトを取得する必要がある場合があります。

この記事では、Django で外部キーの逆引き参照を実行するのがいかに簡単であるかを示します。

Django モデルの逆引き参照

実際のステップに進む前に、デモンストレーション用のモデルまたはテーブルが必要です。教師と生徒の 2つのエンティティについて検討します。生徒には 2 種類の教師がいます。クラスの先生と好きな先生。Student モデルは Teacher モデルを参照しています。

from django.db import models


class Teacher(models.Model):
    name = models.CharField(max_length=200)
    subject = models.CharField(max_length=200)


class Student(models.Model):
    name = models.CharField(max_length=200)
    classTeacher = models.ForeignKey(
        Teacher, on_delete=models.SET_NULL, null=True, related_name="classTeacherOf"
    )
    favouriteTeacher = models.ForeignKey(
        Teacher, on_delete=models.SET_NULL, null=True, related_name="favouriteTeacherOf"
    )

Student モデルの 2つのフィールドは、Teacher モデルを参照しています。Django では、同じモデルを複数回参照する場合、単一の参照フィールドに対する Django のデフォルトの related_name が他の参照フィールドと衝突するため、すべてのフィールドに related_name を指定する必要があります。それ以外の場合、Django は例外をスローします。

related_name は、逆引き参照に使用するものです。一般に、Django のデフォルトの関連名を使用するのではなく、すべての外部キーに related_name を指定することをお勧めします。

例 1

id1 の先生がいます。この個人をクラスの教師として持つすべての生徒を取得する必要がある場合は、次のようにします。

teacher = Teacher.objects.get(id=1)
students = teacher.classTeacherOf.all()
print(students)  # A QuerySet of Student objects

related_name をどのように使用しているかに注目してください。teacher.classTeacherOf はマネージャーオブジェクトです。つまり、all()filter()exclude() などのメソッドを呼び出します。

例 2

id6 の先生がいます。この教師をお気に入りの教師と見なすすべての生徒を取得する必要がある場合は、次のようにします。

teacher = Teacher.objects.get(id=6)
students = teacher.favouriteTeacherOf.all()
print(students)  # A QuerySet of Student objects

例 3

id25 の先生がいます。この教師が id5 の生徒のクラス教師であるかどうかを確認する必要がある場合は、次のようにします。

teacher = Teacher.objects.get(id=25)
student = teacher.classTeacherOf.filter(id=5)
print(student)  # A QuerySet of either 1 or 0 Student

逆引き参照でオブジェクトが見つからない場合は、空の QuerySet が返されることに注意してください。

著者: Vaibhav Vaibhav
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

関連記事 - Django Object