@ShawnFumo Desconexión de una señal es peligroso si el mismo modelo se guarda en otro lugar, al mismo tiempo, no hagas eso!
@Aram Dulyan, ¡su solución funciona pero le impide utilizar señales que son tan potentes!
Si desea evitar la recursión y seguir usando las señales(), una forma sencilla de hacerlo es establecer un atributo en la instancia actual para evitar que las próximas señales se activen.
Esto se puede hacer usando un decorador simple que comprueba si la instancia dada tiene la 'skip_signal' atributo, y si es así evita que el método que se llame:
from functools import wraps
def skip_signal():
def _skip_signal(signal_func):
@wraps(signal_func)
def _decorator(sender, instance, **kwargs):
if hasattr(instance, 'skip_signal'):
return None
return signal_func(sender, instance, **kwargs)
return _decorator
return _skip_signal
Ahora podemos usarlo de esta manera:
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=MyModel)
@skip_signal()
def my_model_post_save(sender, instance, **kwargs):
# you processing
pass
m = MyModel()
# Here we flag the instance with 'skip_signal'
# and my_model_post_save won't be called
# thanks to our decorator, avoiding any signal recursion
m.skip_signal = True
m.save()
Espero que esto ayude.
¿Tal vez agregue algún código para que su situación se vuelva más clara? – adamk
No sucederá si usa pre_save, ya que no tiene que llamar a save() usted mismo, sucederá entonces «naturalmente». –