【问题标题】:Django models - Model relations misunderstandingsDjango 模型 - 模型关系误解
【发布时间】:2021-01-20 16:02:10
【问题描述】:

我想创建一个只添加一些关于另一个表的信息的表。这是我所拥有的:

我有两张桌子ExchangeExchangeConnection

class Exchange(models.Model):
    slug = models.CharField(max_length=200, primary_key=True, blank=False, null=False)
    name = models.CharField(max_length=200, blank=False, null=False)

class ExchangeConnection(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    exchange = models.OneToOneField(Exchange, on_delete=models.CASCADE)

我定义了多个交换,在整个应用使用过程中不会被修改。只有有用的存储数据才能使我的应用程序正常工作。我觉得它更像是一种ExchangeConnection

然后,我有ExchangeConnection。该表将在整个应用程序使用过程中进行修改,因为它表示属于用户的信息,并且可以创建一些: 当用户创建ExchangeConnection时,他只选择了他正在使用的Exchange

在我的代码中,您可以看到我正在使用 OneToOneField,这并不好,因为这意味着每个 ExchangeConnection 只能“链接”一次 Exchange。

我不想在ExchangeConnection 中使用ForeignKeyField,因为我不希望ExchangeConnections 成为Exchange 的一部分。

我当然误解了关系的逻辑,所以我可能会很清楚......

【问题讨论】:

  • 目前每个ExchangeConnection都可以有一个对应的Exchange。我认为您要说的是 User 得到一个 ExchangeConnection 可以链接到多个 Exchange 对象中的一个。您说您不想要 FK 字段,但我怀疑这实际上是您想要的。只是有点不清楚。
  • 灾难处方:不会修改。不要那样设计。
  • @Belayer 你是什么意思?
  • 不要设计你的系统,好像某些组件永远不会改变;设计以允许更改。然后,如果事实证明它从未改变过,那么您并没有失去任何东西。但是,当它确实改变了您的系统(应用程序)时,可以非常更轻松地进行调整。
  • 你说的是我说的某些组件在整个应用程序使用过程中永远不会改变的事实?我的意思是它会在很长一段时间内改变,但不会改变那么多。无论如何,我的代码将允许更改。

标签: python sql django postgresql


【解决方案1】:

简答:

ForeignKeyField 在这种情况下是正确的选项。

为什么? (长答案)

这句话表明你的想法是错误的。

我不想在 ExchangeConnection 中使用 ForeignKeyField,因为我不希望 ExchangeConnections 成为 Exchange 的一部分。

让我们这样说:

当您在ExchangeConnection 中使用ForeignKeyField 时,Exchanges 将成为ExchangeConnection 的链接或一部分。

ExchangeConnection 不会成为 Exchange 的一部分。

例如,假设您使用了OneToOneField。有两个用户,Sam 和 Richard。 您已经使用user = Samexchange = Exchange1 保存了第一个ExchangeConnection 对象。 那么你不能用user = Richardexchange = Exchange1保存第二个ExchangeConnection对象。

在这种情况下会发生什么? ExchangeConnection 对象不应有多个包含 exchange = Exchange1 的实例。换句话说,它不应包含重复项。

结论:

OneToOneField = ForeignKey + (unique=True)

【讨论】:

  • 是的,我真的想错了。感谢所有这些解释!
猜你喜欢
  • 2019-07-30
  • 1970-01-01
  • 2013-02-10
  • 2014-01-22
  • 2016-06-16
  • 2010-12-30
  • 1970-01-01
  • 2017-01-24
相关资源
最近更新 更多