我找不到任何关于为什么会发生这种情况的文档,但根据文档,批量操作不应该触发模型信号。
现在问题是,如果我执行 somequeryset.delete(),即使它是批量操作,每个删除的对象都会触发一个信号!另一方面,somequeryset.update(someField=5) 不会触发任何信号!
所以这实际上是一个意外的结果,我希望两者的行为都相同。
Django 1.7.7
有什么想法吗?我希望删除具有信号,但不接受在批量删除时触发它。
如此处所解释的那样,它实际上并不会对每个项调用delete()方法,但它确实会调用信号。我不知道是否可能,但我也同意应该至少有一些选项在queryset.delete()中跳过信号执行。
pre_delete
或 post_delete
,快速路径的自动检测可以工作,但跳过信号还不是可选的。 - serguituspost_delete
信号并将其代码放在自定义的 delete()
方法中。这样,当你删除一个对象(object.delete()
)时,原本在信号中的代码会被执行,但是当你使用 QuerySet.delete() 时,由于它不会调用 object.delete(),所以你就可以摆脱那段代码了。 - serguitus
somequeryset.delete()
调用delete
方法,它不是批量删除。 - Gocht