我需要保存一个模型,但是在保存它之前,我需要断开一些信号接收器的连接.

我是说,

我有个模特:

class MyModel(models.Model):
    ...

def pre_save_model(sender, instance, **kwargs):
    ...

pre_save.connect(pre_save_model, sender=MyModel)

在代码的另一个地方,我需要这样的东西:

a = MyModel()
...
disconnect_signals_for_model(a)
a.save()
...
reconnect_signals_for_model(a)

因为在这种情况下,我需要在不执行函数pre_save_model的情况下保存模型.

推荐答案

对于干净且可重用的解决方案,您可以使用上下文管理器:

class temp_disconnect_signal():
    """ Temporarily disconnect a model from a signal """
    def __init__(self, signal, receiver, sender, dispatch_uid=None):
        self.signal = signal
        self.receiver = receiver
        self.sender = sender
        self.dispatch_uid = dispatch_uid

    def __enter__(self):
        self.signal.disconnect(
            receiver=self.receiver,
            sender=self.sender,
            dispatch_uid=self.dispatch_uid,
            weak=False
        )

    def __exit__(self, type, value, traceback):
        self.signal.connect(
            receiver=self.receiver,
            sender=self.sender,
            dispatch_uid=self.dispatch_uid,
            weak=False
        )

现在,您可以执行以下操作:

from django.db.models import signals

from your_app.signals import some_receiver_func
from your_app.models import SomeModel

...
kwargs = {
    'signal': signals.post_save,
    'receiver': some_receiver_func,
    'sender': SomeModel, 
    'dispatch_uid': "optional_uid"
}
with temp_disconnect_signal(**kwargs):
    SomeModel.objects.create(
        name='Woohoo',
        slug='look_mom_no_signals',
    )

Note: If your signal handler uses a 100, you 102 use the 100 arg.

Django相关问答推荐

在保存新实例之前删除一个实例(Django模型保存方法)

Django-Values()并按月分组

从Azure Web应用服务器上的cron任务的虚拟环境加载变量

设置wagail开发环境时出现ImportError:";无法从';wagta.search;";导入名称.

在 Django 模板中分页时如何正确显示与其父模型字段关联的所有内联字段?

如何让两个模型相互引用 Django

Django,如何从模型表单的 Select 字段中删除空白 Select ?

django excel xlwt

Django:创建索引:非唯一,多列

Django:如何使用动态(非模型)数据预填充 FormView?

Python Django 模板和测试变量是否为空或空字符串

Django模板转义

在 Django 中舍入小数点

单击弹出框会滚动回页面顶部 [Bootstrap 和 Django]

如何在 django 元素中开始做 TDD?

Django manage.py:在其依赖之前应用迁移

Django查询否定

Django 模型:delete() 未触发

django-rest-framework 接受 JSON 数据?

提供来自 django 的压缩内容