django防止删除模型实例

sap*_*api 6 python django django-models

我有一个models.Model子类,它代表我的mysql数据库上的一个View(即managed = False).

但是,在运行我的单元测试时,我得到:

DatabaseError:(1288,'DELETE的目标表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
Run Code Online (Sandbox Code Playgroud)

在我的测试的tearDown期间,我正在删除ActualTableModel实例,并且看起来django正在遵循记录的行为:

当Django删除一个对象时,它会模拟SQL约束ON DELETE CASCADE的行为 - 换句话说,任何具有指向要删除的对象的外键的对象都将随之删除.

当应用于(managed = False)视图时,这似乎会导致问题.

我试过覆盖删除方法以防止删除:

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

但这并没有解决问题.

我该如何防止这种行为?

jpi*_*pic 9

也许你可以尝试各种on_delete参数选项之一

即:

problematic_field = models.ForeignKey(ActualTableModel, on_delete=models.PROTECT)
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提供文档链接。我试过 on_delete=models.SET_NULL,但我忽略了 DO_NOTHING。后者修复了错误。 (2认同)