I have registered my signal with the callback using the @receiver decorator
@receiver(post_save, sender=User, dispatch_uid=\'ARandomUniqueString
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