Reverse Lookups von Fremdschlüsseln in Django
Django ist ein effizientes Webentwicklungs-Framework, das die Erstellung von Webanwendungen vereinfacht. Django macht es mühelos, sich mit Authentifizierung und Autorisierung zu befassen, HTML-Vorlagen zu erstellen, mit statischen Dateien umzugehen, mit Datenbanken zu interagieren und CRUD-Operationen über diese durchzuführen.
Apropos Datenbanken: Django vereinfacht die meisten Abfragen, die Sie bei der Arbeit mit Datenbanken durchführen können. Eine solche Abfrage ist der umgekehrte Look; Ein Beispiel ist, wenn wir alle Objekte einer Tabelle abrufen müssen, die auf einen bestimmten Datensatz derselben Tabelle oder eines anderen Modells verweisen.
Dieser Artikel zeigt, wie einfach es ist, Reverse-Lookups von Fremdschlüsseln in Django durchzuführen.
Reverse Lookups in Django-Modellen
Bevor wir zum eigentlichen Schritt übergehen, benötigen wir einige Modelle oder Tabellen zur Demonstration. Wir werden zwei Entitäten betrachten: Lehrer und Schüler. Der Schüler hat zwei Arten von Lehrern; ein Klassenlehrer und ein Lieblingslehrer. Das Modell Student
bezieht sich auf das Modell 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"
)
Zwei Felder des Modells Student
verweisen auf das Modell Teacher
. Wenn in Django das gleiche Modell mehr als einmal referenziert wird, müssen wir für alle Felder einen related_name
angeben, da Djangos Standard related_name
für ein einzelnes referenzierendes Feld mit anderen referenzierenden Feldern kollidiert. Andernfalls löst Django eine Ausnahme aus.
Der related_name
ist das, was wir für die Rückwärtssuche verwenden. Im Allgemeinen empfiehlt es sich, für alle Fremdschlüssel einen related_name
anzugeben, anstatt den standardmäßigen Namen von Django zu verwenden.
Beispiel 1
Wir haben einen Lehrer, dessen id
1
ist. Wenn wir alle Schüler haben müssen, die diese Person als Klassenlehrer haben, werden wir Folgendes tun:
teacher = Teacher.objects.get(id=1)
students = teacher.classTeacherOf.all()
print(students) # A QuerySet of Student objects
Beachten Sie, wie wir den related_name
verwenden. Der teacher.classTeacherOf
ist ein Manager-Objekt, was bedeutet, dass wir Methoden wie all()
, filter()
, exclude()
darauf aufrufen.
Beispiel 2
Wir haben einen Lehrer, dessen id
6
ist. Wenn wir alle Schüler finden müssen, die diesen Lehrer als ihren Lieblingslehrer ansehen, werden wir so etwas tun:
teacher = Teacher.objects.get(id=6)
students = teacher.favouriteTeacherOf.all()
print(students) # A QuerySet of Student objects
Beispiel 3
Wir haben einen Lehrer, dessen id
25
ist. Wenn wir prüfen müssen, ob dieser Lehrer der Klassenlehrer eines Schülers ist, dessen id
5
ist, gehen wir wie folgt vor:
teacher = Teacher.objects.get(id=25)
student = teacher.classTeacherOf.filter(id=5)
print(student) # A QuerySet of either 1 or 0 Student
Beachten Sie, dass, wenn beim Reverse-Lookup keine Objekte gefunden werden, ein leeres QuerySet
zurückgegeben wird.