为什么我创建的模型实例在之后直接从 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/