Django
Viele-zu-viele-Beziehungen
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