首页 > 解决方案 > 如何使用 django 使 celery beat 任务适用于所有对象,而不仅仅是单个对象?

问题描述

我正在尝试通过调度程序任务删除过期的收据,但我遇到了一个问题,因为每次函数运行时,它只删除 1 个对象,即使还有更多。当调度程序每 60 分钟运行一次时,如何更改我必须确保删除所有已过期的对象的代码?

@periodic_task(run_every=crontab(minute='*/60'))
def delete_expired_receipts():
    receipts = Receipt.objects.all()
    for receipt in receipts:
        if receipt.expiry_date <= timezone.now():
            receipt.delete()
            return "deleted the receipts at {}".format(timezone.now())
    return "No receipts"

谢谢

标签: djangodjango-viewscelerydjango-celerydjango-celery-beat

解决方案


您需要删除循环中的 return 语句

@periodic_task(run_every=crontab(minute='*/60'))
def delete_expired_receipts():
    receipts = Receipt.objects.filter(expiry_date__lte=timezone.now())
    if receipts:
       receipts.delete()
       return "Reciepts have been deleted"
    return "No receipts"

推荐阅读