Recherches inversées de clés étrangères dans Django

Vaibhav Vaibhav 10 aout 2021
Recherches inversées de clés étrangères dans Django

Django est un framework de développement Web efficace qui simplifie la création d’applications Web. Django permet de gérer sans effort l’authentification et l’autorisation, la création de modèles HTML, le traitement des fichiers statiques, l’interaction avec les bases de données et l’exécution d’opérations CRUD sur celles-ci.

En parlant de bases de données, Django simplifie la plupart des requêtes que vous pouvez effectuer lorsque vous travaillez avec des bases de données. L’une de ces requêtes est le regard inversé ; un exemple est lorsque nous devons obtenir tous les objets d’une table qui font référence à un enregistrement particulier de la même table ou d’un modèle différent.

Cet article montrera à quel point il est simple d’effectuer des recherches inversées de clés étrangères dans Django.

Recherches inversées dans les modèles Django

Avant de passer à l’étape proprement dite, nous avons besoin de modèles ou de tableaux de démonstration. Nous considérerons deux entités : l’enseignant et l’élève. L’étudiant a deux types d’enseignants; un professeur de classe et un professeur préféré. Le modèle Student fait référence au modèle 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"
    )

Deux champs du modèle Student font référence au modèle Teacher. Dans Django, lorsque vous référencez plusieurs fois le même modèle, nous devons fournir un related_name pour tous les champs car le related_name par défaut de Django pour un seul champ de référencement entre en conflit avec les autres champs de référencement. Sinon, Django lèvera une exception.

Le related_name est ce que nous utilisons pour la recherche inversée. En général, il est recommandé de fournir un related_name pour toutes les clés étrangères plutôt que d’utiliser le nom associé par défaut de Django.

Exemple 1

Nous avons un enseignant dont id est 1. Si nous devons obtenir tous les élèves qui ont cette personne comme enseignant de classe, nous procéderons comme suit :

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

Remarquez comment nous utilisons le related_name. Le teacher.classTeacherOf est un objet gestionnaire, ce qui signifie que nous appelons des méthodes comme all(), filter(), exclude() dessus.

Exemple 2

Nous avons un enseignant dont id est 6. Si nous devons obtenir tous les élèves qui considèrent ce professeur comme leur professeur préféré, nous ferons quelque chose comme ceci :

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

Exemple 3

Nous avons un enseignant dont id est 25. Si nous devons vérifier si ce professeur est le professeur de la classe d’un élève dont id est 5, nous procéderons comme suit :

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

Notez que si aucun objet n’est trouvé dans la recherche inversée, un QuerySet vide est renvoyé.

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.