You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Django 4.2视图中调用Celery 5.5.1任务时出现'delay_on_commit'属性不存在的问题

在Django 4.2视图中调用Celery 5.5.1任务时出现'delay_on_commit'属性不存在的问题

嗨,我来帮你搞定这个问题!

首先得明确:你用@shared_task装饰的Celery任务本身并没有delay_on_commit这个方法,这就是报错的根源。你想实现的应该是「在Django事务提交后再执行Celery任务」的效果对吧?下面给你两种靠谱的解决方式:

方法一:用Celery原生的apply_async加on_commit参数

直接修改视图里的任务调用代码就行,把delay_on_commit换成带参数的apply_async:

# django view
def testview(request):
    from tasks import generate_report

    # 替换原来的delay_on_commit调用
    generate_report.apply_async(args=["mytestdata"], on_commit=True)

    return render(request, "simple_pag...")

apply_async是Celery任务的标准异步调用方法,加上on_commit=True后,Celery会自动绑定当前Django事务,等事务成功提交后再触发任务,完美契合你的需求。

方法二:用Django自带的事务钩子

如果需要更灵活的控制(比如提交后要执行多个操作),可以用Django的transaction.on_commit:

# django view
from django.db import transaction

def testview(request):
    from tasks import generate_report

    # 定义要在事务提交后执行的函数
    def run_report_task():
        generate_report.delay("mytestdata")
    
    # 注册钩子,事务提交后自动执行
    transaction.on_commit(run_report_task)

    return render(request, "simple_pag...")

这种方式是Django官方推荐的事务后操作方式,不管你用不用Celery都能适用,兼容性更强。

最后提醒一句:确保你的视图是在事务上下文里(Django默认视图会自动开启事务),如果你的视图手动关闭了事务,那on_commit会立刻执行任务哦。

备注:内容来源于stack exchange,提问作者Davy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:05:26