从后台任务更新django模型

时间:2017-12-06 22:46:38

标签: python django django-rest-framework

我正在尝试使用django-background-tasks从任务更新django模型。这就是我所拥有的:

@background(schedule=0)
def difficult_work():
    for i in range(0,100):
        time.sleep(1)
        with transaction.atomic():
            workProgress = WorkProgress.objects.filter(id="fixed_work_id_for_testing").select_for_update().get()

            print("updating work progress to " + str(i))
            workProgress.progress = i
            workProgress.currentJobInfo = "test work"

            # if we've finished then make sure to set the status
            if i == 100:
                workProgress.status = "success"

            transfer.save(force_update=True)

此外,我有一个API视图来获取工作任务的进度。

class WorkDetail(APIView):
def get(self, request, workId, format=None):
    with transaction.atomic():
        work = WorkProgress.objects.filter(id=workId).select_for_update().get()
        data = WorkProgressSerializer(transfer).data

        return Response(data)

问题是,我在执行任务时没有看到对数据库的任何更新。我已经运行了python manage.py dbshell,监视数据库表,并且随着任务的进行它们没有更新。我确保运行python manage.py process_tasks,并输出正确的print语句,指示进度,但在任务退出之前数据库不会更新。

我找到了遇到类似问题的人here,但他们只是在测试时遇到过这种情况,他们没有get()更新的模型。但是,我甚至没有在dbshell中看到数据库更新。

如何在任务运行时确保更新表?

注意:根据this网站,他们使用celery取得了一些成功。谁能证实这一点?我会试一试并评论可行性。

2 个答案:

答案 0 :(得分:1)

您的项目 settings.py

INSTALLED_APPS = [
....
]

...
# Add to Option
BACKGROUND_TASK_RUN_ASYNC=True

答案 1 :(得分:0)

django-background-tasks似乎在原子事务中执行后台任务(请参阅issue here),这意味着更改仅在任务完成后提交给数据库。

他们最近removed the @atomic decorators,但没有更改版本号(目前仍然是1.1.13)。