Django:在queryset.update上发出信号

Ber*_*ant 10 django django-signals

如果您正在使用该queryset.delete()方法,Django正在发送pre/post_delete信号,但是它不应该发送pre/post_save queryset.update()吗?

Jos*_*man 8

也许应该,但事实并非如此..update()不会对QuerySet中的各个对象调用.save()方法,而是在单个SQL调用中更新all(UPDATE,因为它发生).由于它不使用.save(),因此调用保存前和保存后信号会不一致.我当然可以设想一个人们可能希望它这样做的用例,但我也可以设想一个人不会这样做的情况.在我看来,没有调用保存前和保存后信号是正确的行为,因为它为程序员留下了更多的灵活性.手动触发这些信号并不难,而且我认为要求程序员记住触发信号以获得所需行为绝对是一个更好的设计决策,而不是要求他们记住断开信号以避免不良行为.

  • 好吧,尽管提到的原因我认为这在某种程度上是不一致的行为,因为 queryset.delete() 方法也不会在单个实例上调用 delete() ,但它发送与 model.delete() 相同的信号! (2认同)