14π
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.
3π
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
3π
I just encountered the same problem. I have a receiver that does something important which must be done only once for each new creation of a model instance in Django. So, I used the post_save
signal, but that was being called twice for the creation of each new model instance which I was doing like Profile.objects.create(...)
.
The solution to this problem is the created
flag which comes with kwargs
. Hereβs how you can use that flag to make sure your intended action is taken only once:
@receiver(post_save, sender=Profile)
def publish_auction(sender, **kwargs):
if kwargs['created']:
kwargs['instance'].send_email_confirmation()
I tried the dispatch_uid
suggestion from Django docs. It didnβt work, but the code I pasted above works.
1π
I have put the
from app.signals import *
code in__init__.py
You should not put anything in your __init__.py
file.
If you remove this from __init__.py
, and add it to the bottom of your models.py
, it should solve your problem.
You should also avoid βblindβ imports from foo import *