4

升级到 Django 1.6 在我的代码中引入了一个棘手的问题:由post_save信号触发的数据库操作被包含在 with transaction.atomic(): Django 的get_or_create().

对我的影响是自定义 sql(非托管)没有及时提交给数据库。

退出其原子块 是否可以使用不同的信号?obj.save()

还是我诊断错了?

4

3 回答 3

6

Django在一个原子块中get_or_create()执行它save(),并且触发 post_save 的信号嵌套在该原子块中。

get_or_create()我的解决方法是在自定义管理器中用我自己的版本覆盖本机,没有transaction.atomic()阻止。

于 2014-02-13T18:37:38.397 回答
0

为了使信号正常运行,您需要退出原子事务,因为在拍摄 transsaccion 信号时没有数据库中的提交。

于 2015-09-04T13:45:30.837 回答
0

老问题,但我今天遇到了这个。

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)
于 2021-10-07T15:56:43.827 回答