任何人都可以仅使用 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,介于Album
和Song
之间,表示如下:
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 Admin ForeignKey字段小部件选项和不一致的默认值