Man*_*aux 6 python django django-signals django-models
当收到信号时,我正在对模型的对象执行一些持久性操作post_save
,其中包括对save()
. 显然,该save()
调用发送了一个post_save
信号,我正在信号递归中着陆。
post_save
有没有办法阻止 Django在特定调用上发送信号save()
?或者我可以在信号回调中检测到呼叫是否“循环”?
我尝试通过添加属性来修改模型的对象,但似乎django.db.models.base.Model.save_base
将“净化”对象传递给信号回调,该回调不再包含该属性:
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完整的情况比仅仅接收信号、修改对象并持久化要复杂一些。事实上,我有两个相同的 Django 实例(在不同的服务器上),它们交换创建或修改的对象(通过 \xc3\x98MQ)并将其保存在自己的数据库中。我不想使用任何类型的数据库同步,因为应用程序需要易于部署,甚至应该与 sqlite 一起使用。
\n\n由于这应该适用于所有模型,无论它们是否是通过视图或管理应用程序修改/创建的,我更愿意找到一种使用信号的方法,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
Run Code Online (Sandbox Code Playgroud)
实际上,我用来django.core.serializers.deserialize
反序列化收到的对象,然后save()
对反序列化的对象执行 a ,这会调用save_base(raw=True)
模型的 。
另请参阅: /sf/answers/1579214731/
归档时间: |
|
查看次数: |
2355 次 |
最近记录: |