微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决尝试删除相关对象时 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(…)。当然,这完全取决于希望在那种情况下发生什么。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。