7
如果您使用的是queryset.delete()
方法,那麼Django會發送pre/post_delete信號,但不應該發送queryset.update()
上的pre/post_save?Django:在queryset.update上的信號
如果您使用的是queryset.delete()
方法,那麼Django會發送pre/post_delete信號,但不應該發送queryset.update()
上的pre/post_save?Django:在queryset.update上的信號
也許應該,但它沒有。 .update()不會在QuerySet中的單個對象上調用.save()方法,而是在單個SQL調用中更新所有(更新,因爲它發生)。由於它不使用.save(),因此調用保存前和保存後的信號將會不一致。我當然可以設想人們可能希望這樣做的用例,但我也可以設想一個用例不可用。在我看來,沒有調用保存前和保存後的信號是正確的行爲,因爲它給程序員留下了更多的靈活性。手動觸發這些信號並不難,我認爲這是一個更好的設計決策,要求程序員記住觸發信號以獲得所需的行爲,而不是讓他們記住斷開信號以避免不良行爲。
雖然提到的原因我認爲這是某種不一致的行爲,因爲queryset.delete()方法也不會調用單個實例上的delete(),但它會發送與model.delete()一樣的信號! – 2009-11-07 17:37:14
此外,爲了能夠在查詢集上發送保存相關信號,除了更新之外,他們基本上還需要爲元素進行選擇,從而消除了批量更新方法的優勢。 – 2012-11-21 16:10:33