我有两个型号的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是否提供了在安全删除前进行此类检查的内容?
答案 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查询,从而使其安全(我认为)。