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 查询,因此很安全(我认为)。
我有一个包含两个模型的 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 查询,因此很安全(我认为)。