Disconnect signals for models and reconnect in django

后端 未结 5 1017
心在旅途
心在旅途 2020-12-08 14:11

I need make a save with a model but i need disconnect some receivers of the signals before save it.

I mean,

I have a model:

class MyModel(mo         


        
5条回答
  •  半阙折子戏
    2020-12-08 14:32

    I haven't tested the following code, but it should work:

    from django.db.models.signals import pre_save
    
    
    def save_without_the_signals(instance, *args, **kwargs):
        receivers = pre_save.receivers
        pre_save.receivers = []
        new_instance = instance.save(*args, **kwargs)
        pre_save.receivers = receivers
        return new_instance
    

    It will silence signals from all sender's though not just instance.__class__.


    This version disables only the given model's signals:

    from django.db.models.signals import pre_save
    from django.dispatch.dispatcher import _make_id
    
    
    def save_without_the_signals(instance, *args, **kwargs):
        receivers = []
        sender_id = _make_id(instance.__class__)
        for index in xrange(len(self.receivers)):
            if pre_save.receivers[index][0][1] == sender_id:
                receivers.append(pre_save.receivers.pop(index))
        new_instance = instance.save(*args, **kwargs)
        pre_save.receivers.extend(receivers)
        return new_instance
    

提交回复
热议问题