django 防止删除模型实例

6 投票
1 回答
6141 浏览
提问于 2025-04-17 13:28

我有一个模型的子类,它代表了我在mysql数据库中的一个视图(也就是说,管理状态是False)。

但是,当我运行单元测试时,出现了以下错误:

数据库错误: (1288, '目标表 my_view_table 的删除操作不可更新')

这个删除请求的来源是通过一个外键(间接)发起的。我简化了一下代码:

class MyViewModel(models.Model):
    problematic_field = models.ForeignKey(ActualTableModel) # specifying on_delete=models.SET_NULL simply replaces the DELETE error with an UPDATE one

在我的测试的清理阶段,我删除了 ActualTableModel 的实例,而看起来 Django 正在遵循文档中描述的行为:

当 Django 删除一个对象时,它会模拟 SQL 中的 ON DELETE CASCADE 约束的行为——换句话说,任何指向要删除对象的外键的对象也会被一并删除。

这在应用到(管理状态为False的)视图时似乎造成了问题。

我尝试重写删除方法来防止删除:

class MyViewModel(models.Model):
    ...
    def delete(self, *args, **kwargs):
        pass # deletion of a view row is never valid

但这并没有解决问题。

我该如何防止这种行为呢?

1 个回答

10

也许你可以试试不同的 on_delete 参数选项

比如说:

problematic_field = models.ForeignKey(ActualTableModel, on_delete=models.PROTECT)

撰写回答