Bernhard Vallant
Bernhard Vallant

Reputation: 50786

Django: Signal on queryset.update

Django is sending the pre/post_delete signals if you are using the queryset.delete() method, but shouldn't it then also send pre/post_save on queryset.update()?

Upvotes: 13

Views: 6203

Answers (2)

Karim Bourahla
Karim Bourahla

Reputation: 79

I agree, .update() can be used to prevent a signal dispatch, for example if you wanna update an instance without firing a signal you should use it and not the .save() method.

Upvotes: 2

Josh Ourisman
Josh Ourisman

Reputation: 1118

Perhaps it should, but it doesn't. .update() does not call the .save() method on the individual objects in the QuerySet, and instead updates the all in a single SQL call (UPDATE, as it happens). Since it doesn't use .save(), it would be inconsistent for it to call the pre- and post-save signals. I can certainly envision use-cases in which one might want it to do so, but I can also envision cases in which one wouldn't. It seems to me that not calling the pre- and post-save signals is the correct behavior here as it leaves more flexibility for the programmer. It's not hard to trigger those signals manually, and I think it's definitely a better design decision to ask programmers to remember to trigger the signals to get desired behavior than asking them to remember to disconnect the signals to avoid undesired behavior.

Upvotes: 15

Related Questions