【问题标题】:Django reverse foreign key constraintDjango反向外键约束
【发布时间】:2022-01-04 08:27:08
【问题描述】:

我有 2 个模型,资产和交易。 Trade 模型具有通过外键链接的 Asset,它允许空值取决于 Trade 的状态。资产总是需要通过外键链接到交易。一个资产可以有多个交易,但一个交易只能有 1 个资产。问题是有时在没有交易的情况下创建资产,这需要失败,因为它会导致进一步的错误,因为这是不可能的。如何确保 Asset 模型的反向外键永远不为空,但将 on_delete 参数保持为 SET_NULL?

class Trade(models.Model):
    status = models.CharField(max_length=10)
    asset = models.ForeignKey(
        Asset,
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
)
    
class Asset(models.Model):
    price = models.DecimalField(max_digits=16, decimal_places=2)
    

【问题讨论】:

  • 这是您应该添加到视图中的验证。
  • 另外,这没什么意义——为什么没有Trade 就不能存在Asset?我认为这里的问题不在于您的验证,而在于您考虑数据库结构的方式。
  • 看来,逻辑有点不对劲。将 on_delete 参数保留为 SET_NULL 与您的逻辑无关(资产应该有交易)。我们需要在 View 中验证何时创建资产以及何时删除交易。 set_null 在资产被删除时应用(与当前行为无关)。
  • 没有Trade 就无法存在Asset,因为创建它需要Trade。这个Trade 将处于“打开”状态。具有“关闭”状态的 Trade 不会有 Asset。虽然它可以由视图创建,但也可以由自动化过程创建。解决办法可能是这个过程中的代码需要改,但是我的第一选择是使用模型来修复。

标签: django foreign-keys constraints


【解决方案1】:

你应该使用多对一而不是foraing键

【讨论】:

  • 根据定义,OP 已经具有多对一关系。
  • 我明白了,但是models.ForaingKey建立的是一对一的关系,而不是你需要使用多对一。
  • models.ForeignKey 建立多对一关系。一对一的关系是通过models.OneToOneField 实现的
  • 没错。 FK 是多对一的。 @UtkuMutlu - 以你的想法交换文件,你会看到 - 在这种情况下,一种资产可以用于许多交易。如果一项资产仅限于单笔交易,那就不同了,应该使用一对一的字段。但是,真正的 1-2-1 字段通常是多余的,而可能只是主模型上的一个字段。不总是,但经常:)
  • Opss,我错了。感谢您的修复:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多