模型中的Django一对多关系(不是关于查找)

时间:2017-12-07 08:52:55

标签: python django django-models relationship

我试图弄清楚如何定义两个模型之间的一对多关系。这里的困难在于我不想触摸其中一个模型,因此不能使用通常的ForeignKey(多对一)。

关于这个主题有很多问题,但他们都讨论了如何进行查找(反向ForeignKey查找),或者他们建议只在一侧添加外键。 这是一个similar question。我将使用相同的代码示例。 这就是我要找的东西:

class Dude(models.Model):
    numbers = models.OneToManyField('PhoneNumber')

class PhoneNumber(models.Model):
    number = models.CharField()

通常我会继续,只需按照许多答案中的建议将一个外键添加到PhoneNumber:

class PhoneNumber(models.Model):
    dude = models.ForeignKey(Dude, related_name='numbers')

但在我的情况下,我不想触及PhoneNumber模型,因此在Dude模型上定义了一些内容。

这样做的原因是我正在定义一个描述很少使用的特殊情况的模型。如果我在(PhoneNumber)模型上使用ForeignKey,我将有99.9%的所有实例将此字段留空。我真的不喜欢有一个总是空白的领域的想法 - 也许这是我的问题。

一种可能的解决方法是定义一个多对多字段,然后添加一些逻辑,实际上一方面阻止'many'并强制另一方不为空。

我希望我能清楚地描述我的问题。

问题: 有没有办法定义一对多的关系?对我的问题采用不同的方法是否有更好的解决方案?

P.S。我从django docs得到的唯一一个是字段属性one_to_many,我猜,它用于查找。

1 个答案:

答案 0 :(得分:0)

  

如果我在(PhoneNumber)模型上使用ForeignKey,我会有99.9%的模型将此字段留空。我真的不喜欢有一个总是空白的领域的想法 - 也许这是我的问题。

有点像。要定义一对多,请使用ForeignKey,这需要在PhoneNumber模型上。就我所见,这对您的方法没有任何缺点。听起来主要的问题是你已经习惯使用一个反过来做这个的库,所以这样做对你来说似乎很奇怪。

我害怕我不明白你的意思

  

99.9%的模型将此字段留空

除非您通过设置null=True, blank=True等来允许,否则他们不能将其留空。