我有一个Django应用程序,我在视图中创建了一个db条目。然后,我想对新条目执行后台处理。不是将创建的对象发送给任务,而是发送对象的id,然后后台任务可以获取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)
,它会正常工作。我不明白为什么我得到这个错误,因为对象应该在数据库?有人知道怎么解吗?我真的不想在每个地方都添加sleep命令。
我使用Postgres作为我的数据库
试试这个
from django.db import transaction
with transaction.atomic():
instance = MyModel.objects.create(**kwargs)
tasks.my_task.delay(instance.id)
https://docs.djangoproject.com/en/4.1/topics/db/transactions/
提交后执行操作有时您需要执行一个操作与当前数据库事务相关,但仅当事务成功提交。例如芹菜任务、邮件通知或缓存失效
Django提供了
on_commit()
函数来注册回调事务成功后应该执行的函数承诺:
on_commit(func, using=None)