我有一个模特:
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表以防止发生此错误?
答案 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)