Django:在删除之前安全地检查相关对象

时间:2017-07-31 08:59:25

标签: python django model race-condition

我有两个型号的Django应用程序:

class Foo(models.Model):
    baz = models.CharField(max_length=100)

class Bar(models.Model):
    foo = models.ForeignKey(Foo)

在视图中,我想删除Bar对象。目前已完成:

foo_to_delete = Foo.objects.get(pk=1)
if not foo_to_delete.bar_set.exists(): # step 1
    foo_to_delete.delete() # step 2

但现在,如果在步骤1和步骤2之间,有人保存了一个新的Bar对象,foo字段指向foo_to_delete个对象,这个新的{{1对象将在步骤2中删除。

有没有办法避免这种情况,可能是通过单个SQL调用? Django ORM是否提供了在安全删除前进行此类检查的内容?

1 个答案:

答案 0 :(得分:2)

我想我已经使用models.PROTECT解决了这个问题。

模型现在看起来像这样:

class Foo(models.Model):
    baz = models.CharField(max_length=100)

class Bar(models.Model):
    foo = models.ForeignKey(Foo, on_delete=models.PROTECT)

视图是这样的:

foo_to_delete = Foo.objects.get(pk=1)
try:
    foo_to_delete.delete()
except models.ProtectedError:
    # show an error message

这似乎只映射到一个SQL查询,从而使其安全(我认为)。