【问题标题】:Django one-to-many relationship in models (not about lookups)模型中的 Django 一对多关系(与查找无关)
【发布时间】: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


【解决方案1】:

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

确实如此。要定义一对多,请使用ForeignKey,这需要在PhoneNumber 模型上。据我所知,这不会给您的方法带来任何缺点。听起来主要问题是您习惯于使用相反的方式执行此操作的库,因此以这种方式执行此操作对您来说似乎很奇怪。

恐怕我不明白你的意思

99.9% 的模型将此字段留空

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

【讨论】:

  • 我的意思是说该模型的所有实例中有 99.9% 会将其留空。我必须将 null 和空白定义为 True,是的。
  • 我习惯于在PhoneNumber模型上定义ForeignKey,有没有别的办法呢?我想反过来做,但我不知道怎么做。基本上是一个反向外键。
  • 据我所知,没有办法执行反向 ForeignKey,而且我怀疑任何实现都将是维护和继续使用核心 django 及其所有第三方应用程序的巨大痛苦。如果没有对您的用例的详细说明,我无法推荐任何其他解决方案或方法
猜你喜欢
  • 2014-05-16
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 2018-01-04
  • 2019-05-09
  • 2014-01-22
  • 1970-01-01
相关资源
最近更新 更多