Opened 16 years ago
Last modified 16 years ago
#12149 closed
pre_save is not called before the overridden save() method on a model — at Initial Version
| Reported by: | siddhi | Owned by: | nobody |
|---|---|---|---|
| Component: | Uncategorized | Version: | 1.1 |
| Severity: | Keywords: | ||
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
If I have a model where I override the save() method, then the pre_save signal is not sent before the save method is called.
Example:
class MyModel(models.Model):
name = models.CharField(max_length=20)
def save(self, force_insert=False, force_update=False):
if self.name == "dont_save":
return
super(Project, self).save(force_insert, force_delete)
def presave_handler(sender, instance, **kwargs):
instance.name = "dont_save"
signals.pre_save.connect(presave_handler, sender=MyModel, dispatch_uid="abc")
In the above case, the flow goes like this
- call overridden save method
- check the condition in save method (condition is false)
- call super
- call pre_save
- set name to "dont_save"
- object saved to database with name = "dont_save"
This is rather unintuitive that the pre_save gets called in the middle of the save method. Also, any processing done in the pre_save cannot be handled in the save method as the flow has gone to the super class by then.
The expected flow should be like this
- call overridden save method
- call pre_save
- set name to "dont_save"
- execution enters save method
- check condition in overridden save method (condition is true)
- return without saving
Note:
See TracTickets
for help on using tickets.