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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow