Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 262
Gocht Avatar asked Mar 11 '16 20:03

Gocht


People also ask

Should you use signals in Django?

Only use signals to avoid introducing circular dependencies. If you have two apps, and one app wants to trigger behaviour in an app it already knows about, don't use signals. The app should just import the function it needs and call it directly.

What is pre_ save?

pre_save. it's used before the transaction saves.

What is the use of the Post_delete signal in Django?

Django Signals - post_delete()To notify another part of the application after the delete event of an object happens, you can use the post_delete signal.

How do I override a saved method?

save() method from its parent class is to be overridden so we use super keyword. slugify is a function that converts any string into a slug. so we are converting the title to form a slug basically.


2 Answers

You wouldn't find any performance difference. Neither of them are hacks or "wrong" coding method. It's all how you like it.

You can use signals if you are getting circular imports when overriding save method or when saving from somewhere else.

I follow a pattern where, if the changes belong to same model, override the save method, else if they belong to a different model which isn't linked to the current model (by one to one or one to many), use signals.

like image 131
RA123 Avatar answered Oct 19 '22 17:10

RA123


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.

like image 31
Andreas Bergström Avatar answered Oct 19 '22 17:10

Andreas Bergström