Reverse Lookups von Fremdschlüsseln in Django

Vaibhav Vaibhav 10 August 2021
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.

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.

Verwandter Artikel - Django Object