为什么在Django模型中使用ManyToManyField的"through"参数?

Mat*_*lla 6 django many-to-many django-models django-orm

浏览Django文档并试图弄清楚使用"通过"参数.这是doc的链接.

这个例子:

class Person(models.Model):
    name = models.CharField(max_length=128)

    def __unicode__(self):
        return self.name

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')

    def __unicode__(self):
        return self.name

class Membership(models.Model):
    person = models.ForeignKey(Person)
    group = models.ForeignKey(Group)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)
Run Code Online (Sandbox Code Playgroud)

为什么Group的"成员"属性需要?成员资格的"组"外键是否足以遵循关系并访问该信息?

Chr*_*att 10

我觉得你对这个问题的看法太过分了.假设您没有使用through:

class Person(models.Model):
    name = models.CharField(max_length=128)

    def __unicode__(self):
        return self.name

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person)

    def __unicode__(self):
        return self.name
Run Code Online (Sandbox Code Playgroud)

Django,在幕后,基本上为您创建了以下模型:

class GroupPerson(models.Model)
    group = models.ForeignKey(Group)
    person = models.ForeignKey(Person)
Run Code Online (Sandbox Code Playgroud)

创建Membership模型的原因是添加默认模型Django 自动创建的额外数据默认情况下,但由于您不再使用默认模式,因此您必须告诉Django使用through.基本上,你保留了Django为ManyToManyFields提供的API.