Django                
            多対多の関係
        
        
            
    サーチ…
スルーモデルで
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.")
一緒に一意のインデックスを作成することをお勧めします(developer,skill) 。これは、データベースが外部のdjangoからアクセス/変更されている場合に特に便利です。このようなインデックスは、明示的なスルーモデルが使用されていないときにdjangoによって作成されることがわかります。 
単純な多対多の関係。
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)
ここでは、クラブが多くのPersonとメンバーを持ち、Personが複数の異なるClubのメンバーとなる関係を定義します。 
 2つのモデルしか定義していませんが、djangoは実際にデータベースに3つのテーブルを作成します。これらはmyapp_person 、 myapp_club 、およびmyapp_club_membersです。 Djangoは自動的にmyapp_club_members(club_id,person_id)列にユニークなインデックスを作成します。 
ManyToManyフィールドの使用
最初の例からこのモデルを使用します。
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)
トムとビルをナイトクラブに加える:
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)
クラブには誰がいますか?
for person in nightclub.members.all():
    print(person.name)
あなたに与えるだろう
Tom
Bill
Modified text is an extract of the original Stack Overflow Documentation
        ライセンスを受けた CC BY-SA 3.0
        所属していない Stack Overflow