Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django post save signal getting called twice despite uid

I have registered my signal with the callback using the @receiver decorator

@receiver(post_save, sender=User, dispatch_uid='ARandomUniqueString') 
def do_callback(sender, **kwargs):

I have put the from app.signals import * code in __init__.py and I can see that it gets imported twice and I do not think there is a good way to fix it, possibly happening due to installed apps in settings.py. I cannot understand why despite using dispatch_uid and the modelInstance.save being invoked only once, it still runs do_callback twice. Any suggestions?

like image 454
Pratik Mandrekar Avatar asked Aug 17 '12 20:08

Pratik Mandrekar


2 Answers

Ok so I moved the import to views.py (or models.py and while it was getting imported only once, it was getting called twice.

The problem was that the post_save signal was getting called when the object was created as well as saved. I have no idea why so I added a workaround which now works

created = False

    #Workaround to signal being emitted twice on create and save
    if 'created' in kwargs:
        if kwargs['created']:
            created=True

    #If signal is from object creation, return
    if created:
        return

Edit:

post_save was getting called twice because I used .create(...) which is equivalent to __init__(...) and .save().

Conclusion

dispatch_uid does work and doing single imports is still a good practice.

like image 116
Pratik Mandrekar Avatar answered Oct 11 '22 18:10

Pratik Mandrekar


I had the same problem with post_save and also post_delete signals. It seems that the session object and LogEntry object were being saved as well creating multiple signals despite setting the dispatch_uid.

What worked for me was:

from django.contrib.admin.models import LogEntry
from django.contrib.sessions.models import Session

....

if sender in [LogEntry, Session]:
    return 
else:
    # do your thing here
like image 31
SteveC Avatar answered Oct 11 '22 19:10

SteveC