阻止特定 save() 调用的信号发送

Man*_*aux 6 python django django-signals django-models

当收到信号时,我正在对模型的对象执行一些持久性操作post_save,其中包括对save(). 显然,该save()调用发送了一个post_save信号,我正在信号递归中着陆。

\n\n

post_save有没有办法阻止 Django在特定调用上发送信号save()?或者我可以在信号回调中检测到呼叫是否“循环”?

\n\n

那不起作用

\n\n

我尝试通过添加属性来修改模型的对象,但似乎django.db.models.base.Model.save_base将“净化”对象传递给信号回调,该回调不再包含该属性:

\n\n
def callback(sender, **kwargs):\n    instance = kwargs[\'instance\']\n    if not hasattr(instance, \'no_signal\'):\n        # (...) Perform actions\n        instance.no_signal = True\n        instance.save()\npost_save.connect(callback, dispatch_uid=\'post_save_callback\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

背景

\n\n

完整的情况比仅仅接收信号、修改对象并持久化要复杂一些。事实上,我有两个相同的 Django 实例(在不同的服务器上),它们交换创建或修改的对象(通过 \xc3\x98MQ)并将其保存在自己的数据库中。我不想使用任何类型的数据库同步,因为应用程序需要易于部署,甚至应该与 sqlite 一起使用。

\n\n

由于这应该适用于所有模型,无论它们是否是通过视图或管理应用程序修改/创建的,我更愿意找到一种使用信号的方法,post_save而不是引入自己的信号,这需要在不同的点触发在项目(包括User模型)中。

\n

Man*_*aux 6

save_base(raw=True)我通过调用来解决问题save(),然后检查kwarg['raw']信号处理程序中的:

def receive_signal(sender, **kwargs):
    instance, raw = kwargs['instance'], kwargs['raw']
    if not raw:
        # Send the instance to the other Django node
Run Code Online (Sandbox Code Playgroud)

实际上,我用来django.core.serializers.deserialize反序列化收到的对象,然后save()对反序列化的对象执行 a ,这会调用save_base(raw=True)模型的 。

另请参阅: /sf/answers/1579214731/