Django -延迟创建数据库条目



我有一个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)

相关内容

最新更新