gpt4 book ai didi

python - 防止为特定的 save() 调用发送信号

转载 作者:太空狗 更新时间:2023-10-30 02:45:39 24 4
gpt4 key购买 nike

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

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

那没用

我试图通过添加一个属性来修改模型的对象,但似乎 django.db.models.base.Model.save_base 将一个“清理过的”对象传递给信号回调,它确实不再包含该属性:

def callback(sender, **kwargs):
instance = kwargs['instance']
if not hasattr(instance, 'no_signal'):
# (...) Perform actions
instance.no_signal = True
instance.save()
post_save.connect(callback, dispatch_uid='post_save_callback')

背景

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

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

最佳答案

我通过调用 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

实际上,我正在使用 django.core.serializers.deserialize 反序列化我接收到的对象,然后对反序列化的对象执行 save(),它调用模型的 save_base(raw=True)

See also: https://stackoverflow.com/a/22560210/145013

关于python - 防止为特定的 save() 调用发送信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23770704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com