Représenter une relation un à plusieurs dans Django
- Représenter une relation un à plusieurs à l’aide d’un modèle de jonction / intermédiaire
- Représenter une à plusieurs relations à l’aide de clés étrangères
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
.