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”吗?是的,我打了一个错