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
id
が 1
の先生がいます。この個人をクラスの教師として持つすべての生徒を取得する必要がある場合は、次のようにします。
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
id
が 6
の先生がいます。この教師をお気に入りの教師と見なすすべての生徒を取得する必要がある場合は、次のようにします。
teacher = Teacher.objects.get(id=6)
students = teacher.favouriteTeacherOf.all()
print(students) # A QuerySet of Student objects
例 3
id
が 25
の先生がいます。この教師が id
が 5
の生徒のクラス教師であるかどうかを確認する必要がある場合は、次のようにします。
teacher = Teacher.objects.get(id=25)
student = teacher.classTeacherOf.filter(id=5)
print(student) # A QuerySet of either 1 or 0 Student
逆引き参照でオブジェクトが見つからない場合は、空の QuerySet
が返されることに注意してください。