从Django文档......
当您只处理简单的多对多关系时,例如混合和匹配比萨饼和浇头,您只需要一个标准的ManyToManyField即可.但是,有时您可能需要将数据与两个模型之间的关系相关联.
例如,考虑应用程序跟踪音乐家所属的音乐组的情况.一个人与他们所属的组之间存在多对多关系,因此您可以使用ManyToManyField来表示此关系.但是,您可能希望收集的成员资格有很多详细信息,例如此人加入该组的日期.
对于这些情况,Django允许您指定将用于管理多对多关系的模型.然后,您可以在中间模型上添加额外的字段.中间模型与ManyToManyField相关联,使用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, 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)
现在您已经设置了ManyToManyField以使用您的中间模型(在这种情况下为Membership),您已准备好开始创建一些多对多关系.您可以通过创建中间模型的实例来完成此操作:
ringo = Person.objects.create(name="Ringo Starr")
paul = Person.objects.create(name="Paul McCartney")
beatles = Group.objects.create(name="The Beatles")
m1 = Membership(person=ringo, group=beatles,
... date_joined=date(1962, 8, 16),
... invite_reason= "Needed a new drummer.")
m1.save()
beatles.members.all()
[<Person: Ringo Starr>]
ringo.group_set.all()
[<Group: The Beatles>]
m2 = Membership.objects.create(person=paul, group=beatles, …Run Code Online (Sandbox Code Playgroud)