为什么我创建的模型实例在之后直接启动的芹菜任务中查询时找不到?例如:
# 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
异常:
# 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()
调用该方法后立即执行数据库操作。