删除对象模型之前添加规则存在问题

时间:2019-02-21 11:00:08

标签: django django-models django-admin

我有两个独立的预算和转化模型,如下所示。

class Budget(models.Model):
    budget = models.FloatField(null=False, blank=False)
    currency = models.ForeignKey(to=Currency, on_delete=models.PROTECT, null=False, blank=False)
    date = models.DateField(null=False, blank=False, unique=False)
class Conversion(models.Model):
    currency = models.ForeignKey(to=Currency, on_delete=models.PROTECT, null=False, blank=False)
    rate = models.FloatField(null=True, blank=False)
    date = models.DateField(null=False, blank=True, unique=False)

我想在删除对象转换之前添加一条规则。如果存在依赖转换的预算,则不应删除该转换。

关于删除django对象的文章很多,但我找不到可以接受的解决方案,它们都有缺点。

我尝试过的:

  • 覆盖方法.delete()并引发ValidationError->返回服务器错误。
  • 实施@receiver(pre_delete, sender=Conversion)并引发ValidationError->返回服务器错误
  • 使用从管理员删除功能时,未调用覆盖方法.clean()

我非常感谢一个解决方案,该解决方案可以防止用户删除Conversion对象并且不返回500错误。

谢谢

1 个答案:

答案 0 :(得分:0)

您的问题没有道理。您说的是Conversion对象,如果存在依赖它的Budget对象,则不应删除。但是,当前数据库中的ConversionBudget模型之间没有关系。它们都将外键引用到Currency,但这并不直接将它们关联起来。

如果您想以某种方式链接ConversionBudget,则可以使用on_delete=models.Protect添加外键,如下所示:

class Budget(models.Model):
    budget = models.FloatField(null=False, blank=False)
    currency = models.ForeignKey(to=Currency, on_delete=models.PROTECT, null=False, blank=False)
    date = models.DateField(null=False, blank=False, unique=False)
    conversion = models.ForeignKey(to=Conversion, on_delete=models.PROTECT)

现在,尝试将Budget指向Conversion,然后删除该Conversion。 Django不允许您这样做。