Django
Relations plusieurs-à-plusieurs
Recherche…
Avec un modèle traversant
class Skill(models.Model):
name = models.CharField(max_length=50)
description = models.TextField()
class Developer(models.Model):
name = models.CharField(max_length=50)
skills = models.ManyToManyField(Skill, through='DeveloperSkill')
class DeveloperSkill(models.Model):
"""Developer skills with respective ability and experience."""
class Meta:
order_with_respect_to = 'developer'
"""Sort skills per developer so that he can choose which
skills to display on top for instance.
"""
unique_together = [
('developer', 'skill'),
]
"""It's recommended that a together unique index be created on
`(developer,skill)`. This is especially useful if your database is
being access/modified from outside django. You will find that such an
index is created by django when an explicit through model is not
being used.
"""
ABILITY_CHOICES = [
(1, "Beginner"),
(2, "Accustomed"),
(3, "Intermediate"),
(4, "Strong knowledge"),
(5, "Expert"),
]
developer = models.ForeignKey(Developer, models.CASCADE)
skill = models.ForeignKey(Skill, models.CASCADE)
"""The many-to-many relation between both models is made by the
above two foreign keys.
Other fields (below) store information about the relation itself.
"""
ability = models.PositiveSmallIntegerField(choices=ABILITY_CHOICES)
experience = models.PositiveSmallIntegerField(help_text="Years of experience.")
Il est recommandé de créer un index unique (developer,skill)
. Ceci est particulièrement utile si votre base de données est en cours d'accès / modifiée depuis l'extérieur de django. Vous constaterez qu'un tel index est créé par django lorsqu'un modèle explicite n'est pas utilisé.
Simple plusieurs à plusieurs relations.
class Person(models.Model):
name = models.CharField(max_length=50)
description = models.TextField()
class Club(models.Model):
name = models.CharField(max_length=50)
members = models.ManyToManyField(Person)
Nous définissons ici une relation dans laquelle un club a plusieurs Person
et membres et une personne peut être membre de plusieurs Club
différents.
Bien que nous ne définissions que deux modèles, django crée en réalité trois tables dans la base de données pour nous. Ce sont myapp_person
, myapp_club
et myapp_club_members. Django crée automatiquement un index unique sur les myapp_club_members(club_id,person_id)
.
Utiliser les champs ManyToMany
Nous utilisons ce modèle du premier exemple:
class Person(models.Model):
name = models.CharField(max_length=50)
description = models.TextField()
class Club(models.Model):
name = models.CharField(max_length=50)
members = models.ManyToManyField(Person)
Ajouter Tom et Bill à la boîte de nuit:
tom = Person.objects.create(name="Tom", description="A nice guy")
bill = Person.objects.create(name="Bill", description="Good dancer")
nightclub = Club.objects.create(name="The Saturday Night Club")
nightclub.members.add(tom, bill)
Qui est dans le club?
for person in nightclub.members.all():
print(person.name)
Te donnera
Tom
Bill