正确的方法来重新保存对象?

时间:2014-01-27 08:46:54

标签: django signals

我有一个模型,我需要根据某些状态编辑对象。

使用post_save信号我可以识别给定的状态,并从那里运行指定的方法。

我现在的问题是,在这些方法中,我需要在编辑后保存对象,从而导致结束无限的保存循环。是否有一种“正确的方法”来处理这种情况,或者只有坏的或更糟的解决方法?

1 个答案:

答案 0 :(得分:2)

为了避免这种循环,您需要在自定义方法的开头断开连接,然后重新连接以发出信号:

连接到信号的方法内部:

signals.post_save.disconnect(YourModel.your_custom_method, sender=YourModel)

# Do your stuff

instance.save()

signals.post_save.connect(YourModel.your_custom_method, sender=YourModel)

注意:我正在使用“YourModel.your_custom_method,因为我倾向于将其放在模型中,这显然不是强制性的。

编辑:

这个SO问题使用update()而不是save()作为一种更清洁的方式,它可能就是你正在寻找的。

Django post_save preventing recursion without overriding model save()

虽然它可能更干净但我不认为它是一个完美的解决方案,除非使用缓存进行适当管理,因为当你已经将实例作为参数时,你将被迫访问数据库以检索查询集信号...

save_without_signal的想法似乎很有意思,但我想知道如果没有上述警告可以做到这一点。

希望这有帮助,

此致