我有一个Django应用程序,我在视图中创建了一个db条目。然后我想对新条目执行后台处理。我不是将创建的对象发送到任务,而是发送对象的id,然后后台任务可以按照here的说明获取db对象。以下是我的代码:
# In tasks.py
@shared_task
def my_task(model_id):
my_model = MyModel.objects.get(pk=model_id)
# Do stuff with my_model
# In views.py:
def some_view(request):
if request.method == 'POST' and request.is_ajax():
instance = MyModel.objects.create(**kwargs)
tasks.my_task.delay(instance.id)
....
但是,当我尝试在后台任务中获取对象时,我得到匹配查询不存在错误。如果我在获取对象之前添加sleep(1)
,则它将作为例外工作。我不明白为什么我收到这个错误,因为对象应该在DB中?有人知道如何解决这个问题吗?我真的不想在任何地方添加一个睡眠命令。
我正在使用Postgres作为我的数据库。
答案 0 :(得分:2)
试试这个
from django.db import transaction
with transaction.atomic():
instance = MyModel.objects.create(**kwargs)
tasks.my_task.delay(instance.id)