Représenter une relation un à plusieurs dans Django

Vaibhav Vaibhav 30 janvier 2023
  1. Représenter une relation un à plusieurs à l’aide d’un modèle de jonction / intermédiaire
  2. Représenter une à plusieurs relations à l’aide de clés étrangères
Représenter une relation un à plusieurs dans Django

Les bases de données jouent un rôle clé presque partout, et il n’est pas surprenant que le développement Web en soit un. Construire des tables et établir des relations entre les tables à l’aide de SQL est une tâche simple, mais Django la rend encore plus simple.

Cet article présentera comment représenter une à plusieurs relations dans Django.

Représenter une relation un à plusieurs à l’aide d’un modèle de jonction / intermédiaire

Référez-vous aux définitions des modèles suivants.

class Number(models.Model):
    number = models.CharField(max_length=10)


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


class PersonNumber(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="numbers")
    number = models.ForeignKey(Number, on_delete=models.CASCADE, related_name="person")

Le modèle Number dispose d’un champ number pour mémoriser un numéro de téléphone.

Le modèle Person a un champ name pour le nom de la personne.

PersonNumber est un modèle de jonction ou intermédiaire pour Number et Person. Les clés étrangères ont une relation en cascade avec les objets référencés. Ce modèle peut être utilisé pour mettre en place une relation un-à-plusieurs ainsi qu’une relation plusieurs-à-plusieurs.

La clé primaire par défaut pour tous les modèles est id, un champ automatique entier.

Étant donné qu’un numéro de téléphone n’est associé qu’à une seule personne, mais qu’une personne peut avoir plusieurs numéros de téléphone, il s’agit d’une relation un-à-plusieurs. PersonNumber sera utilisé pour représenter cette relation.

Si une variable person stocke un objet Person, nous pouvons facilement accéder à tous les numéros de téléphone de cette personne en utilisant l’instruction suivante.

numbers = person.numbers.objects.all()

Cette instruction renverra un QuerySet d’objets Number.

Considérez cet exemple.

ID Person Number
1 1 1
2 1 2
3 1 3
4 1 4
5 2 5
6 2 6
7 3 7

Une personne avec id 1 a quatre numéros de téléphone avec id 1, 2, 3 et 4.
Une personne avec id 2 a deux numéros de téléphone avec id 5 et 6.
Une personne avec id 3 a un seul numéro de téléphone avec id 7.

Représenter une à plusieurs relations à l’aide de clés étrangères

Référez-vous aux définitions des modèles suivants.

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


class Number(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    number = models.CharField(max_length=10)

Le modèle Person a un champ name pour le nom de la personne.

Le modèle Number possède un champ number pour stocker un numéro de téléphone et une clé étrangère faisant référence au modèle Person. Ce champ stockerait le propriétaire de ce numéro. La clé étrangère a une relation en cascade avec le modèle référencé, Person.

En utilisant cette structure, nous pouvons facilement associer chaque objet Number à son propriétaire respectif en utilisant la référence de clé étrangère.

Si une variable person stocke un objet Person, nous pouvons accéder à tous les numéros associés à cette personne à l’aide de l’instruction suivante.

numbers = Number.objects.filter(person=person)

Cette instruction renverra un QuerySet d’objets Number.

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.