2015-06-01 70 views
0

我找不到任何文件,爲什麼會發生這種情況,但根據文檔批量操作不應觸發模型信號。django信號與批量刪除/更新

現在的問題是,如果我做somequeryset.delete()信號觸發每個刪除的對象,即使它是批量操作!另一方面,somequeryset.update(someField = 5)不會觸發任何信號!

所以這是一個意想不到的結果,我希望兩者的行爲相同。

Django 1.7.7

任何想法?我想刪除有信號,但觸發大容量刪除是不可接受的

+2

'somequeryset.delete()'正在調用'delete'方法,它不是批量。 – Gocht

+0

不,它不是,因爲我檢查了所做的查詢,它做了一個DELETE ... WHERE id IN(匹配查詢的ID列表) – user1777914

+0

之後,它似乎稱之爲後刪除事件,但實際上並沒有任何刪除。 – user1777914

回答

0

如解釋here它確實不會調用每個項目的delete()方法,但它會調用信號。我不知道這是否可能,但我也同意應該至少有一些選項en queryset.delete()來跳過信號執行。

+0

你說得對,刪除操作確實需要一些調整。如果我只想要批量刪除選項,總是使用「第一路徑」而不是調用信號等。看起來像現在唯一的選擇將是一個原始查詢。 – user1777914

+0

顯然,[this](https://code.djangoproject.com/ticket/9519)是與此功能相關的長期公開門票。你是對的,原始查詢似乎是目前唯一的選擇:-(自動檢測快速路徑的作品,如果你沒有'pre_delete'或'post_delete'定義但跳過信號不是可選的 – serguitus

+0

我找到了一個工作,得到類似的行爲,我只是刪除了post_delete信號,並將該代碼放在一個自定義的delete()方法中,這樣,當你擦除一個對象('''object.delete()''')時,最初在信號中的代碼被執行,但是當你執行QuerySet.delete()時,因爲它不調用object.delete(),所以你得到了該代碼。 – serguitus