尝试删除相关对象时 FOREIGN KEY 约束失败

问题描述

所以我的应用中有这些模型:

from django.db import models
from accounts.models import vendedor


class Comissao(models.Model):
    porcentagem = models.FloatField()


    def __str__(self):
        return str(self.porcentagem)


class venda(models.Model):
    vendedor = models.ForeignKey(vendedor,on_delete=models.DO_nothing)
    comissao_venda = models.ForeignKey(Comissao,on_delete=models.DO_nothing)
    data_venda = models.DateField(auto_Now_add=True)
    valor_venda = models.FloatField()
    descricao_venda = models.CharField(max_length=60)


    @property
    def valor_a_receber(self):
        return self.comissao_venda.porcentagem * self.valor_venda


    def __str__(self):
        return str(self.vendedor)

我的问题是当我尝试删除 Comissao 对象时出现此错误

FOREIGN KEY constraint Failed

我已经被这个错误困了几个小时了,希望有人能帮我...XD

解决方法

这是由于 DO_NOTHINGForeignKey 在数据库级别强制执行:这意味着 commissao_venda 需要引用有效的 Comissao,但如果您删除了 Commisao,则情况不再如此,因此数据库拒绝了这一点。或者,如文档所述:

不采取任何行动。如果您的数据库后端强制执行参照完整性,这将导致IntegrityError,除非您手动向数据库字段添加 SQL ON DELETE 约束。 >

通常 DO_NOTHING 无论如何都不是一个好主意。问题是,如果 Venda 所指的 Comissao 被删除,您想对 Venda 做什么?两个流行的选项是:

  1. CASCADE,在这种情况下,引用该 ComissaoComissao(s) 也将被移除 。这可以触发其他删除,因此单个 commissao_venda 最终可以触发从多个表中删除大量记录;或

  2. SET_NULL,您必须通过设置 null=True [Django-doc] 使您的字段为 NULLable。在这种情况下,NULL 将设置为 None/comissao_venda = models.ForeignKey(Comissao,null=True,on_delete=models.SET_NULL)。因此,该字段看起来像:

    {{1}}

其他选项包括 PROTECTRESTRICTSET_DEFAULTSET(…)。当然,这完全取决于希望在那种情况下发生什么。