gpt4 book ai didi

django:使用保存后信号进行递归

转载 作者:行者123 更新时间:2023-12-02 09:41:31 26 4
gpt4 key购买 nike

情况如下:

假设我在 django 中有一个模型 A。当我保存一个对象(A 类)时,我需要将它的字段保存到该类的所有其他对象中。我的意思是我需要所有其他 A 对象都是 lat 保存的对象的副本。

当我使用信号(例如保存后)时,我得到一个递归(我猜对象试图互相保存)并且我的Python死掉了。

我预计在保存前/保存后信号中的同一类上使用 .save() 方法会导致递归,但只是不知道如何避免它。

我们做什么?

最佳答案

@ShawnFumo如果同一模型同时保存在其他地方,断开信号是危险的,不要这样做!

@Aram Dulyan ,您的解决方案有效,但阻止您使用如此强大的信号!

如果您想避免递归并继续使用 signal(),一个简单的方法是在当前实例上设置一个属性以防止即将触发的信号。

这可以使用一个简单的装饰器来完成,该装饰器检查给定实例是否具有'skip_signal'属性,如果有,则阻止调用该方法:

from functools import wraps

def skip_signal():
def _skip_signal(signal_func):
@wraps(signal_func)
def _decorator(sender, instance, **kwargs):
if hasattr(instance, 'skip_signal'):
return None
return signal_func(sender, instance, **kwargs)
return _decorator
return _skip_signal

我们现在可以这样使用它:

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=MyModel)
@skip_signal()
def my_model_post_save(sender, instance, **kwargs):
# you processing
pass

m = MyModel()
# Here we flag the instance with 'skip_signal'
# and my_model_post_save won't be called
# thanks to our decorator, avoiding any signal recursion
m.skip_signal = True
m.save()

希望这有帮助。

关于django:使用保存后信号进行递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3246737/

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