I think you are thinking too much about it. Say you did not use 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
Django, behind the scenes, essentially creates the following model for you:
class GroupPerson(models.Model) group = models.ForeignKey(Group) person = models.ForeignKey(Person)
The reason for creating the Membership model is to add additional data that Django automatically creates by default by default, it will not by default, but since you no longer use the default value, you have to tell Django that using through . Basically, you keep the Django API for ManyToManyFields.
source share