升级到 Django 1.6 在我的代码中引入了一个棘手的问题:由post_save
信号触发的数据库操作被包含在
with transaction.atomic():
Django 的get_or_create()
.
对我的影响是自定义 sql(非托管)没有及时提交给数据库。
退出其原子块后 是否可以使用不同的信号?obj.save()
还是我诊断错了?
升级到 Django 1.6 在我的代码中引入了一个棘手的问题:由post_save
信号触发的数据库操作被包含在
with transaction.atomic():
Django 的get_or_create()
.
对我的影响是自定义 sql(非托管)没有及时提交给数据库。
退出其原子块后 是否可以使用不同的信号?obj.save()
还是我诊断错了?
Django在一个原子块中get_or_create()
执行它save()
,并且触发 post_save 的信号嵌套在该原子块中。
get_or_create()
我的解决方法是在自定义管理器中用我自己的版本覆盖本机,没有transaction.atomic()
阻止。
为了使信号正常运行,您需要退出原子事务,因为在拍摄 transsaccion 信号时没有数据库中的提交。
老问题,但我今天遇到了这个。
Django >=1.9 支持transaction.on_commit钩子。
以下是我生成的代码是如何产生的,并且表现出预期的效果:
from django.db import transaction
def my_post_save_hook(sender, instance):
transaction.on_commit(
lambda: do_the_thing()
)
post_save.connect(my_post_save_hook, sender=MyModel)