![](/img/trans.png)
[英]django - using of related_name in ManyToMany and in ForeignKey
[英]Django: ForeignKey vs related_name
我想问一下以下两种表达ForeignKey
关系的方式之间是否有重要区别,还是只是“风格”差异?
先定义零件然后收集零件似乎很直观; 一个“子模型”,然后在填充“主模型”时使用这个“零件表”。 因此, Album_1
model 从Track_1
表(集合由部分组成)中获取单个或多个轨道,如下所示。
版本_1
class Track_1(models.Model):
order = models.IntegerField()
title = models.CharField(max_length=100)
duration = models.IntegerField()
class Album_1(models.Model):
album_name = models.CharField(max_length=100)
artist = models.CharField(max_length=100)
# if Album only holds one (1) track,
tracks = models.ForeignKey(Track_1, on_delete=models.CASCADE)
# if the "record"/"Album" holds several tracks
tracks = models.ManyToManyField(Track_1, blank=True)
同时,将其表达如下不太直观,可以将其口头解释为Track_2
包含一个Album_2
(该部分由一个集合组成)。
版本_2
class Album_2(models.Model):
album_name = models.CharField(max_length=100)
artist = models.CharField(max_length=100)
class Track_2(models.Model):
album = models.ForeignKey(Album_2, related_name='tracks', on_delete=models.CASCADE)
order = models.IntegerField()
title = models.CharField(max_length=100)
duration = models.IntegerField()
我已经多次看到这种差异,我很好奇为什么经常使用看似不直观的“version_2”,例如与 Django Rest 框架有关?
我想说你混合了这些概念:外键定义了模型之间的关系,而related_name 是外键的一个属性,它定义了你将如何引用相关的 model (主要是为了方便)。
这里重要的是外键,因为它定义了应用程序的业务逻辑。 我会说 version_1 model 从业务逻辑的角度来看是有问题的,而 version_2 是有道理的。
让我解释一下,我将从版本 2 开始: 在 version_2 中,您说:我的主要 model 是专辑,如果我删除特定专辑,则该专辑中的所有曲目都将从曲目表中删除。 说得通!
在 version_2 中,您说我的主要 model 是 Track,如果我从 Track 表中删除一首曲目,则包含该特定曲目的所有专辑都将更新,因为该曲目将从包含它的所有专辑中删除。 是否有意义? 也许在某些特殊情况下是的,但总的来说这没有意义。
我认为这里的答案是@Blusky 在评论之一中指出的,他写道:
[...] 反向名称是简化 ORM 使用的“技巧”,但该字段未在数据库中创建
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.