Python Django:ForeignKey vs相关的_名称

Python Django:ForeignKey vs相关的_名称,python,django,django-rest-framework,Python,Django,Django Rest Framework,我想问一下,以下两种表达ForeignKey关系的方式之间是否有重要区别,还是仅仅是“风格”的区别 首先定义零件,然后收集零件似乎很直观;“子模型”,然后在填充“主模型”时使用此“零件表”。因此,Album_1模型从Track_1表中获取一个或多个曲目(集合由部分组成),如下所示 版本1 class Track_1(models.Model): order = models.IntegerField() title = models.CharField(max_length=10

我想问一下,以下两种表达
ForeignKey
关系的方式之间是否有重要区别,还是仅仅是“风格”的区别

首先定义零件,然后收集零件似乎很直观;“子模型”,然后在填充“主模型”时使用此“零件表”。因此,
Album_1
模型从
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)
同时,将其表达为以下内容不太直观,口头上可以解释为
曲目2
包含
专辑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框架中?

我要说的是,您混淆了各种概念:外键定义了模型之间的关系,相关的_名称是外键的属性,这定义了如何引用相关模型(主要是为了方便)

这里重要的是外键,因为它定义了应用程序的业务逻辑。我想说,从业务逻辑的角度来看,version_1模型是有问题的,而version_2是有意义的

让我解释一下,我将从第2版开始: 在version_2中,您会说:我的主要型号是Album,如果我删除某个特定的专辑,该专辑中的所有曲目都将从曲目表中删除。有道理


在版本2中,您说我的主要模型是曲目,如果我从曲目表中删除一首曲目,则包含此特定曲目的所有相册都将更新,因为该曲目将从包含它的所有相册中删除。这有意义吗?可能在某些特殊情况下是的,但一般来说没有意义。

我要说的是混合了各种概念:外键定义了模型之间的关系,而相关的名称是外键的一个属性,它定义了如何引用相关模型(这主要是为了方便)

这里重要的是外键,因为它定义了应用程序的业务逻辑。我想说,从业务逻辑的角度来看,version_1模型是有问题的,而version_2是有意义的

让我解释一下,我将从第2版开始: 在version_2中,您会说:我的主要型号是Album,如果我删除某个特定的专辑,该专辑中的所有曲目都将从曲目表中删除。有道理


在版本2中,您说我的主要模型是曲目,如果我从曲目表中删除一首曲目,则包含此特定曲目的所有相册都将更新,因为该曲目将从包含它的所有相册中删除。这有意义吗?可能在某些特殊情况下是的,但一般来说没有意义。

我认为这里的答案是@Blusky在一篇评论中指出的,他写道:

[…]反向名称是简化ORM使用的一个“技巧”,但是 未在数据库中创建字段


我认为这里的答案是@Blusky在评论中指出的,他写道:

[…]反向名称是简化ORM使用的一个“技巧”,但是 未在数据库中创建字段


您的版本1和版本2不相同。版本1的曲目与专辑之间存在一对多关系,而版本2的曲目与专辑之间存在一对多关系。
相关名称的基本需求是访问与(程序员)友好名称的反向关系。是
album\u 2.曲目集
更好还是
album\u 2.曲目
更好?第二个对吗?谢谢,这将调整问题。我要说的核心是,当你可以“向前”访问“反向关系”时,为什么还要麻烦使用“反向关系”?“向前访问”并不意味着性能。反向名称是简化ORM使用的一个“技巧”,但该字段不是在数据库中创建的。啊哈,现在我明白了,谢谢!您的版本1和版本2不相同。版本1的曲目与专辑之间存在一对多关系,而版本2的曲目与专辑之间存在一对多关系。
相关名称的基本需求是访问与(程序员)友好名称的反向关系。是
album\u 2.曲目集
更好还是
album\u 2.曲目
更好?第二个对吗?谢谢,这将调整问题。我要说的核心是,当你可以“向前”访问“反向关系”时,为什么还要麻烦使用“反向关系”?“向前访问”并不意味着性能。反向名称是简化ORM使用的一个“技巧”,但该字段不是在数据库中创建的。啊哈,现在我明白了,谢谢!您好,@alv2017,通读一遍,您是说第四段中的“版本1”吗?是的,我打了一个错。您好,@alv2017,通读一遍,您是说第四段中的“版本1”吗?是的,我打了一个错