【发布时间】: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