2017-07-31 48 views
0

前安全檢查相關的對象我有一個Django應用程序有兩種模式:的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之間的時間,有人拯救與foo場指向foo_to_delete對象的新Bar對象,這種新的Bar對象將被刪除第2步。

有沒有什麼辦法可以避免這種情況,也許通過執行單個SQL調用? Django ORM在安全刪除之前是否提供了進行這種檢查的功能?

回答

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查詢,從而使得它的安全(我認爲)。