任何人都可以仅使用 ForeignKey 在两个 django 模型之间建立多对多关系吗?

Posted

技术标签:

【中文标题】任何人都可以仅使用 ForeignKey 在两个 django 模型之间建立多对多关系吗?【英文标题】:Can anyone do a many to many relationship between two django models only with the ForeignKey? 【发布时间】:2017-02-04 05:54:42 【问题描述】:

我有两个 Django 模型,假设一个 Album 和一个 Song 模型。

我的Song 模型有一个ForeignKey 字段,因此我可以将多首歌曲关联到Album(多对一关系)。如果我不更改模型中的任何内容并保持原样,如果我更改数据库存储数据的方式(规范化、非规范化等)?

谢谢

【问题讨论】:

【参考方案1】:

不,你不能,这就是 Django 支持的中间表和 ManyToMany relationship 的原因。

其实考虑到你的模型如下:

class Song(models.Model):
    album = FK(Album)

class Album(models.Model):
    attributes ...

您有足够的表现力来为一张专辑存储几首歌曲。您不能有每首歌有多个专辑。

ForeignKey 放在Album 类中只会让事情变得更糟,因为每首歌可以有几张专辑,然后每张专辑都属于一首歌曲! (那肯定是错的吧?)

所以你想要的是一个ManyToMany relationship,介于AlbumSong 之间,表示如下:

class Song(models.Model):
    attributes ...

class Album(models.Model):
    songs = models.ManyToManyField(Song)

这样,每个Song 都属于多个Album,反之亦然,如您所愿。

【讨论】:

我同意你的观点,但是如果我更改数据库的架构会怎样?也许那时我可以只用 ForeignKey 字段成功地建立多对多关系 @jimao 是什么意思,更改我的数据库的架构?如果这意味着将 FK 更改为 M2M,那么可以,但我没有看到任何更改可以帮助您用单个 FK 来表示这种关系。 数据库中的规范化和非规范化技术 数据库规范化或非规范化的目的是减少表连接和关系查找的数量,以换取增加冗余,反之亦然。它们与对 M2M 或 FK 的需求没有任何关系。您的实体之间存在固有的多对多关系,您必须保持这种关系。 好的,非常感谢您的帮助@SpiXel 我想我理解了 django 中 o2m 和 m2m 的概念

以上是关于任何人都可以仅使用 ForeignKey 在两个 django 模型之间建立多对多关系吗?的主要内容,如果未能解决你的问题,请参考以下文章

django ForeignKey 到任何类型的模型

Django Admin ForeignKey字段小部件选项和不一致的默认值

MediaWiki:页面编辑仅允许创建者或经批准

Django 使用 ForeignKey 形成单元测试

DetailView 使用两个 ForeignKey kwargs

Django admin List Display + ForeignKey = Empty Change List