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

Django: Safely check for related objects before deletion

我有一个包含两个模型的 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 对象,这个新的 Bar 对象将被步骤 2 删除。

有什么办法可以避免这种情况,也许只需要调用一次 SQL 即可? Django ORM 是否提供了在安全删除之前进行此类检查的功能?

我想我已经使用 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 查询,因此很安全(我认为)。