即使使用on_delete = do_nothing,也会抛出Integrity_Error(仍然引用键)

时间:2015-11-24 16:26:08

标签: django orm

我有一个模特:

class Project(Model):
    name = models.TextField(...)
    ... bunch of fields ...

我也有一些模型可以跟踪我的应用程序中的历史记录。这些模型对ForeignKey模型有Project个引用:

class Historical_Milestone(Model):
    project = models.ForeignKey('Project', db_index=True, related_name='+',
                                on_delete=models.DO_NOTHING, blank=True, null=True)

当我删除Project表中的项目时,我收到以下IntegrityError:

  

更新或删除表格"项目"违反表格上的外键约束{...}" historical_milestone"   详细信息:Key(id)=(123)仍然从表" historical_milestone"中引用。

历史表中的列设置了related_name='+'(表示我不想反向查找),并且我设置了on_delete=models.DO_NOTHING参数。根据{{​​3}}:

  

如果数据库后端强制实施参照完整性,除非您手动将SQL ON DELETE约束添加到数据库字段,否则这将导致IntegrityError。

不应该related_name标志表示我不关心反向关系吗?我需要采取哪些手动步骤来修改Historical_Milestone表以防止发生此错误?

1 个答案:

答案 0 :(得分:1)

related_name是为了方便起见,它不会影响Django创建的外键约束。设置related_name='+'只是意味着您不希望能够在ORM中访问product.historical_milestone_set(或类似)。

如果要在删除项目后保留id,并且不强制执行外键约束,则最好使用整数字段。

class Historical_Milestone(Model):
    project_id = models.PositiveIntegerField(db_index=True, blank=True, null=True)