我有一个模型,我需要根据某些状态编辑对象。
使用post_save信号我可以识别给定的状态,并从那里运行指定的方法。
我现在的问题是,在这些方法中,我需要在编辑后保存对象,从而导致结束无限的保存循环。是否有一种“正确的方法”来处理这种情况,或者只有坏的或更糟的解决方法?
答案 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()作为一种更清洁的方式,它可能就是你正在寻找的。 p>
Django post_save preventing recursion without overriding model save()
虽然它可能更干净但我不认为它是一个完美的解决方案,除非使用缓存进行适当管理,因为当你已经将实例作为参数时,你将被迫访问数据库以检索查询集信号...
save_without_signal的想法似乎很有意思,但我想知道如果没有上述警告可以做到这一点。
希望这有帮助,
此致