【问题标题】:Django Celery: Model object does not exists within the celery's task (ATOMIC_REQUESTS=False)Django Celery:芹菜任务中不存在模型对象(ATOMIC_REQUESTS=False)
【发布时间】:2016-10-14 09:39:42
【问题描述】:

在进入 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 的配置中都没有任何配置参数来处理这种行为。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2011-05-31
      • 1970-01-01
      • 2019-09-25
      • 2011-12-27
      • 2019-12-15
      • 2012-05-05
      • 2022-01-21
      • 2014-03-16
      • 2013-10-16
      相关资源
      最近更新 更多