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

时间:2016-06-13 20:38:34

标签: python django django-orm django-celery celery-task

在进入芹菜任务之前获取我正在创建的对象时出现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的ATOMIC_REQUESTS配置中没有DATABASE param。所以,默认情况下它应该是False。

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

之前我遇到过类似的问题,我正在更新模型对象的值,但更新后的值并未反映在芹菜的任务中。为了实现这一目标,我增加了10秒的延迟。但这次我正在寻找一些永久的解决方案。有办法解决这个问题吗?我没有在Django或Celery的配置中都有任何配置参数来处理这种行为。

1 个答案:

答案 0 :(得分:0)

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