Django 1.8 - 中间人多对多关系 - 使用'ManytoManyField'的结果是什么?

Str*_*ire 10 django many-to-many django-orm relationship m2m

Django中的多对多关系示例:

class First(models.Model):
    seconds = models.ManyToManyField(Second, through='Middle')

class Middle(models.Model):
    first = models.ForeignKey(First)
    second = models.ForeignKey(Second)

class Second(models.Model):
Run Code Online (Sandbox Code Playgroud)

根据中间模型文档,只有一个相关对的ManytoManyField模型包含上面示例中的模型First.它是否正确?

如果是这样,哪个模型应包含该ManytoManyField字段?使用任何一方的关系是否有任何差异取决于它在哪里ManytoManyField

谢谢

编辑(我应该更清楚):

我对中介表感兴趣,因为我将有额外的数据存储在关系中.

当我说使用时,我并不是指定义模型,我的意思是使用关系(否则我会让Django做它的事情).

如果我想要所有与第一个相关的秒,它是否与获得与第二个相关的所有第一个完全相同,或者ManytoManyField通过引入任何额外的功能使一个方向比另一个方向更容易?

Joe*_*nux 16

从操作角度来看应该没有区别,因此唯一的区别在于模型的定义和影响它的事物(例如,Manager类).

您也不总是需要定义"通过"类.Django会自动为您执行此操作,而该类实际上所做的就是维护第三个表来跟踪其他两个表中每个相关记录的相应ID.您必须决定是否要向第三个表添加任何重要的内容.

例如,假设您正在为会议设计Web应用程序.他们可能希望存储有关与会者(个人和公司)以及发言人和赞助商(也包括个人和公司)的信息.公司的部分模型可能如下所示:

class Company(models.Model):
    name = models.CharField(max_length=100)
    sponsored_segment = models.ForeignKey(ConferenceSegment, null=True)

class ConferenceSegment(models.Model):
    title = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)

但这很快就会变得很麻烦,而且你会有很多与赞助无关的参与公司.此外,您可能想要在网站上跟踪他们的排名/包裹(毕竟,更大的赞助商获得更大的位置):

class Company(models.Model):
    name = models.CharField(max_length=100)

class ConferenceSegment(models.Model):
    title = models.CharField(max_length=100)
    sponsors = models.ManyToManyField(Company, through=u'Sponsor', related_name=u'sponsored_segments')

class Sponsor(models.Model):
    company = models.ForeignKey(Company)
    segment = models.ForeignKey(ConferenceSegment)
    rank = models.PositiveIntegerField()
Run Code Online (Sandbox Code Playgroud)

另请注意.中的"related_name"属性ManyToManyField.这意味着我们可以使用该名称ConferenceSegment通过Company实例访问对象:

c = Company.objects.get(...)
segments = c.sponsored_segments.all()
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.