在进入芹菜任务之前获取我正在创建的对象时出现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的配置中都有任何配置参数来处理这种行为。
答案 0 :(得分:0)
问题是因为我使用的是TransactionMiddleware
,它与@transaction.commit_on_success
装饰器类似。如果您想继续使用TransactionMiddleware
,您应该考虑在视图中使用@transaction.autocommit
decorator与芹菜任务,或@transaction.commit_manually