Django / Celery-对象匹配查询仅在使用延迟时不存在

问题描述

我正在与Django和Celery一起异步发送send_mass_mail。当我调用调用任务的视图函数时,出现以下错误

[2020-09-08 17:47:49,148:错误/ ForkPoolWorker-8]任务main_app.tasks.send_notice [244944f6-604c-47a0-901a-4c510563d76e]引发意外:DoesNotExist('Notice匹配查询不存在。')

这仅在我使用延迟时发生。如果我调用send_notice_task(notice_id)而不是send_notice_task.delay(notice_id),它可以找到通知,但随着时间的推移,它会不断抛出该错误。有什么想法吗?

/views.py

def notice_approve(request,notice_id):
    notice = Notice.objects.get(id=notice_id)
    notice.approve()
    # send_notice_task(notice_id)
    send_notice_task.delay(notice_id)
    return redirect('manage')

/tasks.py

def send_notice_task(notice_id):
    print(notice_id)
    notice = Notice.objects.get(id=notice_id)
    subscribers = Subscriber.objects.filter(approved=True)
    recipient_list = []
    for sub in subscribers:
        recipient_list.append(sub.email)
    datatuple = (f'{notice.subject} - Notice',html_message,'CONCERN Network <cnb@gmail.com>',recipient_list)
    send_mass_mail((datatuple,),fail_silently=False)

解决方法

我有一个类似的问题。

原因:之所以发生这种情况,是因为任务在查询命中数据库之前就已运行

解决方案:因此,强迫任务等待3秒钟才能运行,对我来说还是解决了。

例如,通过更改

send_notice_task.delay(notice_id)

send_notice_task.apply_async((order.id,),countdown=3)