Suche…


Mit einem Durchgangsmodell

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.")

Es wird empfohlen, einen gemeinsam eindeutigen Index (developer,skill) erstellen. Dies ist besonders nützlich, wenn auf Ihre Datenbank von außerhalb des Django zugegriffen wird. Sie werden feststellen, dass ein solcher Index von django erstellt wird, wenn kein explizites Through-Modell verwendet wird.

Einfache viele zu viele Beziehung.

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)

Hier definieren wir eine Beziehung, in der ein Club viele Person und Mitglieder hat und eine Person Mitglied in mehreren verschiedenen Club .

Obwohl wir nur zwei Modelle definieren, erstellt django tatsächlich drei Tabellen in der Datenbank. Dies sind myapp_person , myapp_club und myapp_club_members. Django erstellt automatisch einen eindeutigen Index für myapp_club_members(club_id,person_id) .

ManyToMany-Felder verwenden

Wir verwenden dieses Modell aus dem ersten Beispiel:

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)

Füge Tom und Bill dem Nachtclub hinzu:

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)

Wer ist im Verein?

for person in nightclub.members.all():
    print(person.name)

Werde dir geben

Tom
Bill


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow