gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:11:09 25 4
gpt4 key购买 nike

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):

关注 documentation on intermediary models ,只有一个模型包含 ManytoManyField , model First 在上面的例子中。这样对吗?

如果是这样,哪个模型应该包含 ManytoManyField field ?根据 ManytoManyField 的位置,使用两端的关系是否有任何差异?是?

谢谢

编辑(我应该更清楚):

我对中间表感兴趣,因为我将有额外的数据来存储关系。

当我说用法时,我不是指定义模型,而是指使用关系(否则我会让 Django 来做这件事)。

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

最佳答案

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

您也不总是需要定义“通过”类。 Django 会自动为您做这件事,而该类真正做的就是维护第三个表来跟踪其他两个表中每个相关记录的相应 ID。您必须决定是否要向第三个表中添加任何重要的内容。

例如,假设您正在为 session 设计 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)

但这很快就会变得麻烦,并且您将有很多与赞助无关的参加公司。此外,您可能希望在网站上跟踪他们的排名/套餐(毕竟,更大的赞助商会获得更大的展示位置):
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()

还要注意 ManyToManyField 中的“related_name”属性.这意味着我们可以访问 ConferenceSegment通过 Company 对象使用该名称的实例:
c = Company.objects.get(...)
segments = c.sponsored_segments.all()

希望这可以帮助。

关于Django 1.8 - 中间多对多直通关系 - 使用 'ManytoManyField' 的结果是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31656158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com