"post_create" or "post_first_save" signal
|Reported by:||bmjames||Owned by:||nobody|
|Has patch:||no||Needs documentation:||no|
|Needs tests:||no||Patch needs improvement:||no|
It would be useful to have a built-in signal emitted when a model instance is saved *for the first time*. For example, when I post a new article on my site I want to announce it via Twitter, but I don't want it announced again if I edit the article later.
There are some cases where using the pre_save signal, and checking if the id of the instance is None, is not sufficient. For example, if the URL of the article I want to announce on Twitter contains the article's ID, I can't announce the URL of the article because that ID is not yet known at the time of the pre_save signal.
By the time the post_save signal is emitted, I can't tell whether it was the first time the article was saved if I use only the built-in signals. I must check if the ID of the instance is None before it is saved, store that stateful information somewhere, then access that information on post_save when I am finally able to dispatch the announcement. But this is messy and, in my opinion, far too much of a logical dance for a simple requirement.
The only elegant way I have found is to create my own custom signal which is sent in the model's save() method:
def save(self): first_save = False if self.id is None: first_save = True Model.save(self) if first_save: post_create.send(sender=Post, instance=self)
I believe this should be a common-enough case to warrant a built-in signal, rather than needing to override the save() method in many models.