为什么要使用;透过「;Django模型中的ManyToManyField参数?

为什么要使用;透过「;Django模型中的ManyToManyField参数?,django,django-models,many-to-many,django-orm,Django,Django Models,Many To Many,Django Orm,查看Django文档并试图找出“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) member

查看Django文档并试图找出“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)

为什么甚至需要组的“成员”属性?成员身份的“组”外键不足以跟踪关系并访问该信息吗?

这样做的原因是,组具有此关系的字段,而不必通过其成员身份集跟踪关系


如果没有其他问题,这可以使编写查询变得更简单。至少,这可以使程序员的生活更轻松,代码更容易阅读。一个充分优化的ORM将能够生成适当的索引来加速这种访问(除非我大错特错,django确实这样做了;或者至少South这样做了)。

这样,您就可以从组中直接访问成员。您不一定要直接处理成员身份对象(我的用户甚至从未见过它们)。您只需要存储一些额外信息的组。将会员资格视为个人和团体之间关联的元数据。

我认为你对这一点的想法有点过于直率。假设您没有通过使用

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在幕后为您创建了以下模型:

class GroupPerson(models.Model)
    group = models.ForeignKey(Group)
    person = models.ForeignKey(Person)

创建
成员身份
模型的原因是添加默认模型Django自动创建的默认模型在默认情况下不会拥有的额外数据,但由于您不再使用默认模型,因此必须通过
告诉Django使用
。基本上,您保留了Django为许多字段提供的API。

通过表来存储关系的属性,在这种情况下,例如,一个人加入一个特定的
组的日期是否会提高效率?或者这仅仅是一个方便的问题?但是,将成员存储为一个组中的许多成员,而不需要遵循与成员的向后关系,这两者之间有什么区别呢?我想我真正的问题是,为什么我不想直接处理成员身份对象呢?因为用户的某些操作通常会导致处理Person对象或Group对象。成员身份对象很可能只是偶尔显示的一些数据,而不是在视图/模板之间传递的数据。