Django - When should I use signals and when should I override save method?

Viewed 4054

Personally I like using signals:

from django.db import models
from django.db.models.signals import pre_save

class MyModel(models.Model):

    ...

def custom_action_before_saving(sender, instance, *args, **kwargs):
    ...

pre_save.connect(custom_action_before_saving, sender=MyModel)

But I wonder if there're some times or task when is better override the save method in a model class:

from django.db import models

class MyModel(models.Model):
    ...

    def save(self):
        ...
        super(MyModel, self).save()

I am asking this because there's an example of overriding the save() method (link provided above) in Django's Documentation page, so I don't think it's a bad practice.

Let's take pre_save() as example, docs says:

This is sent at the beginning of a model’s save() method.

Does it means that overriding save has the same effect over performance that using signals?

2 Answers

Choosing between overriding the save method or utilizing signals isn't really a question of performance or best-practice. As the documentation says signals are mainly a great way to keep apps decoupled while stile being able to communicate with each other.

Compared to overriding the save method signals also feels more natural to combine with Celery to off-load certain processing to the background.

Related