代码之家  ›  专栏  ›  技术社区  ›  Forest Kunecke

从后台任务更新django模型

  •  1
  • Forest Kunecke  · 技术社区  · 7 年前

    我正在尝试使用一个任务更新django模型 django-background-tasks . 以下是我得到的:

    @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 回复  |  直到 7 年前
        1
  •  1
  •   SUNHEE MOON    7 年前

    您的项目 设置。py公司

    INSTALLED_APPS = [
    ....
    ]
    
    ...
    # Add to Option
    BACKGROUND_TASK_RUN_ASYNC=True
    
        2
  •  1
  •   Yuzhe Chen    6 年前

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

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