如何解决尝试删除相关对象时 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_NOTHING
:ForeignKey
在数据库级别强制执行:这意味着 commissao_venda
需要引用有效的 Comissao
,但如果您删除了 Commisao
,则情况不再如此,因此数据库拒绝了这一点。或者,如文档所述:
不采取任何行动。如果您的数据库后端强制执行参照完整性,这将导致IntegrityError
,除非您手动向数据库字段添加 SQL ON DELETE
约束。 >
通常 DO_NOTHING
无论如何都不是一个好主意。问题是,如果 Venda
所指的 Comissao
被删除,您想对 Venda
做什么?两个流行的选项是:
-
CASCADE
,在这种情况下,引用该Comissao
的Comissao
(s) 也将被移除 。这可以触发其他删除,因此单个commissao_venda
最终可以触发从多个表中删除大量记录;或 -
SET_NULL
,您必须通过设置null=True
[Django-doc] 使您的字段为 NULLable。在这种情况下,NULL
将设置为None
/comissao_venda = models.ForeignKey(Comissao,null=True,on_delete=models.SET_NULL)
。因此,该字段看起来像:{{1}}
其他选项包括 PROTECT
、RESTRICT
、SET_DEFAULT
和 SET(…)
。当然,这完全取决于您希望在那种情况下发生什么。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。