关联Django一对多外键关系中的属性

时间:2016-03-30 20:53:54

标签: django attributes foreign-keys relationship manytomanyfield

我想模拟Story类和Series类之间的关系。 (即小说三部曲) 这种关系是一对多的" (一个系列可以包含许多故事,但故事只能是一个系列的一部分)。 在模型方面,这可以通过Story上的外键来解决,

part_of = models.ForeignKey(Series
                            , on_delete=models.CASCADE
                            , related_name='contains_story')

但我希望序列号作为这种关系的属性。 即(1:长地球,2:长战,3:长火星,......)。 我可以把它作为Story的一个属性但是不干净,不属于系列的故事不应该有序列号。

在"多对多"这可以通过"通过"来解决。选项。 通过指定一个类并向该类添加属性。

part_of = models.ManyToManyField(Series, through='SeriesPart')

但"系列的一部分"不是多对多的"多对多"关系,我想避免像这样建模并且不得不在代码中限制它,那么我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:0)

我不确定你的异议是否有道理。您可能在多对多关系的直通表上存储额外属性的原因正是因为关系的每一方都可以有多个项目,并且属性值仅与一个特定组合相关。 (在example in the Django docs的情况下,John在披头士乐队之前就在Quarrymen中,所以对于John< - > Quarrymen,John< - >披头士乐队,有单独的joined_date值。保罗< - >甲壳虫)

在您的情况下,故事只能是一个系列的一部分。除了作为Pratchett / Baxter系列的第1部分之外,The Long Earth没有其他位置;它不能同时成为其中的第1部分,也是其他部分的第2部分。因此,没有理由不在故事模型本身上存储序列号。不属于系列的故事可以简单地留空,就像他们将FK留给系列空白一样。