Django celery 任务 : Newly created model DoesNotExist

标签 django asynchronous celery django-celery

为什么我创建的模型实例在之后直接从 celery 任务查询时没有找到?例如:

# app.views

model = Model.objects.create()    # I create my lovely model in a view
from app.tasks import ModelTask   # I import my Async celery task
ModelTask.delay(model.pk)         # I start the task

一切看起来都很好,当然如果我在 create() 之后的任何时候查询调用模型应该存在于数据库中。

更新 1 :我使用默认 transaction.autocommit在我看来,Django 提供的行为。

但是下面的任务抛出了 ObjectDoesNotExist异常(exception):
# app.tasks

class ModelTask(Task):
    def run(self, model_pk):
        from app.models import Model
        Model.objects.get(pk=model_pk)

在我的测试中,正如预期的那样,model_pk是一个正确的正整数 ID。

结论

我假设这里出现了一些异步/“单独的进程”问题,但我不知道它是什么。如果感觉好像我犯了一些明显的错误。

我不认为数据库事务是答案,因为 Django 的默认“自动提交”方法确保在 create() 后立即执行数据库操作。方法被调用。

最佳答案

这些答案需要更新。 Django 现在有 transaction.on_commit()这是为这个确切的问题而构建的,他们甚至提供了一个任务示例:

transaction.on_commit(lambda: some_celery_task.delay('arg1'))

https://docs.djangoproject.com/en/2.1/topics/db/transactions/#django.db.transaction.on_commit

关于Django celery 任务 : Newly created model DoesNotExist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15790380/

相关文章:

linux - epoll()、互斥量和信号量之类的系统调用是如何在后台实现的?

python - celery - errno 111 连接被拒绝

python - 想要显示图像

django - 如何提供存储在 cassandra 数据库中的图像?

javascript - d3 async wait fetch.json 不是函数

asynchronous - 来自 BookSleeve Redis 客户端的缓存异步错误

python - 通过子进程将python的文件之类的对象传递给ffmpeg

python - 如何将 Celery 配置为使用不同的 BROKER_URL 来从同一代理进行生产和消费?

javascript - 将 ionic 移动应用程序与 Django 结合使用进行表单处理的最佳方式

python - 如何从另一个模块扩展模板?