【发布时间】:2018-05-21 07:46:03
【问题描述】:
我试图弄清楚如何定义两个模型之间的一对多关系。这里的困难是我不想触摸其中一个模型,因此不能使用通常的 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% 的实例将此字段留空。我真的不喜欢有一个总是空白的字段的想法——也许这是我的问题。
一种可能的解决方法是定义一个多对多字段,然后添加一些逻辑实际上阻止一侧的“多”并强制另一侧不为空。
我希望我能清楚地描述我的问题。
问题: 有没有办法定义一对多的关系?对于我的问题,是否有更好的解决方案和不同的方法?
附:我从 django 文档中得到的唯一结果是字段属性 one_to_many,我猜它是用于查找的。p>
【问题讨论】:
-
拥有一个通常为空白的字段绝对没有错。如果您担心的话,它不会占用您数据库中的任何重要空间。
-
我实际上在我的问题中将该问题链接为“类似问题”。这个问题的答案不令人满意的原因是我不想碰phoneNumber模型。
-
我不太担心数据库。我只是不喜欢为所有实例定义关系的想法,而实际上只有极少数人真正需要甚至应该拥有这种关系。但也许这是要走的路,我过度设计了这个问题。
-
@jimfawkes 您可以通过 ManyToMany 字段或创建单独的模型来实现它,但所有这些都会比在 PhoneNumber 模型中添加外键产生更大的开销。
标签: python django django-models relationship