Django Celery:芹菜任务中不存在模型对象 (ATOMIC_REQUESTS=False)

Django Celery: Model object does not exists within the celery's task (ATOMIC_REQUESTS=False)

我在进入 celery 任务之前获取我正在创建的对象时出现 MyModel matching query does not exist. 错误。我正在从 APIView.

中调用任务
my_model_obj = MyModel(x=1, y=2)
my_model_obj.save()
my_celery_task.delay(my_model_obj.id)

在我的任务函数中,我正在做:

@task()
def my_celery_task(my_model_id):
    MyModel.objects.get(id=my_model_id)

我的 Django DATABASE 配置中没有 ATOMIC_REQUESTS 参数。所以,默认情况下它应该是 False。

我相信这是因为 Django 甚至在数据实际保存到数据库之前就从模型对象中释放了控制权。这是一个间歇性问题,有时会发生,有时它工作正常。

早些时候我遇到了类似的问题,我正在更新模型对象的值,但更新后的值没有反映在 celery 的任务中。为了达到 运行,我添加了 10 秒的延迟。但这次我正在寻找一些永久性的解决方案。有什么办法可以解决这个问题吗?我在 Django 或 Celery 的配置中都没有任何配置参数来处理这种行为。

问题是因为我使用的是 TransactionMiddleware,它的作用与 @transaction.commit_on_success 装饰器类似。如果你想继续使用 TransactionMiddleware,你应该考虑在 celery 任务的视图中使用 @transaction.autocommit 装饰器,或者 @transaction.commit_manually