【发布时间】:2013-03-25 07:09:06
【问题描述】:
为什么我创建的模型实例在之后直接启动的芹菜任务中查询时找不到?例如:
# 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:在我看来,我正在使用 Django 提供的默认 transaction.autocommit 行为。
但是下面的任务会抛出一个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() 方法后立即执行数据库操作。
【问题讨论】:
-
你检查过它确实保存到数据库吗?并且 pk 值与返回的值相同吗?您是否在日志文件中查看过警告或错误?
-
该模型之后直接在 Django admin 中可见。而且虽然我没有具体检查过,但PK看起来在正确的范围内。我忘了提到有时会找到模型,这就是为什么我认为这是一个种族问题。
-
你能给
model的代码吗(尽可能简化,同时仍然复制错误)?特别是,我假设:pk = models.AutoField(primary_key=True)?
标签: django asynchronous celery django-celery