Django post_save preventing recursion without overriding model save() Django post_save preventing recursion without overriding model save() python python

Django post_save preventing recursion without overriding model save()


you can use update instead of save in the signal handler

queryset.filter(pk=instance.pk).update(....)


Don't disconnect signals. If any new model of the same type is generated while the signal is disconnected the handler function won't be fired. Signals are global across Django and several requests can be running concurrently, making some fail while others run their post_save handler.


What you think about this solution?

@receiver(post_save, sender=Article)def generate_thumbnails(sender, instance=None, created=False, **kwargs):    if not instance:        return    if hasattr(instance, '_dirty'):        return    do_something()    try:        instance._dirty = True        instance.save()    finally:        del instance._dirty

You can also create decorator

def prevent_recursion(func):    @wraps(func)    def no_recursion(sender, instance=None, **kwargs):        if not instance:            return        if hasattr(instance, '_dirty'):            return        func(sender, instance=instance, **kwargs)        try:            instance._dirty = True            instance.save()        finally:            del instance._dirty    return no_recursion@receiver(post_save, sender=Article)@prevent_recursiondef generate_thumbnails(sender, instance=None, created=False, **kwargs):    do_something()