如何每天检查一次

时间:2016-01-14 09:54:31

标签: django web

在我的模型中,我关心每个对象在数据库中的持续时间并标记为活动状态。因此,如果模型处于活动状态超过几天,它应该在对象名称出现的每个位置都给出一个警报图标。

目前我正在计算每个GET请求中所有对象的日期差异(今天 - 创建日期)。但我不认为这是正确的方法,因为当网站结束时我会有数千个对象。

进行此类检查的专业方法是什么? 谢谢

2 个答案:

答案 0 :(得分:1)

让我们隔离你在每个GET请求上调用的检查函数。我们将该函数命名为run_checks()

run_checks()应该做的是,在整个数据库或其子集上运行,例如从日期X到日期Y,取决于您的业务。如果可能,它应该做的另一件事:它应该持续检查的状态。例如。如果您使用图标标记,则可以MyModel.flagged = True/FalseMyModel.flagged = NULL/date

保持报告的状态允许您在下次运行中选择快捷方式,例如您只能在非标记行上运行检查,例如rows_to_check = MyModel.objects.exclude(flagged=True)

现在,一旦你有了检查功能:

  • 您可以将其设置为./manage.py run_checks custom Django command并定期从 cron (使用@daily命令)调用它,

  • 或者,在任务队列(Celery,django-background-task,python-rq等)上定期安排

答案 1 :(得分:1)

尝试使用celery periodic task

制作这样的芹菜时间表:

from celery.schedules import crontab

CELERYBEAT_SCHEDULE = {
    'add-every-monday-morning': {
       'task': 'tasks.check_active_objects',
       'schedule': crontab(minute=0, hour=0),  # Will run everyday midnight
   },

}

并将此方法添加到tasks.py中,以使标记的对象在阈值时间之前创建:

@app.task
def check_active_objects():
    current_time = datetime.now()
    threshold_time = current_time - datetime.timedelta(days=2)
    YourModel.objects.filter(creation_date__lte = threshold_time).update(alarm_flag=True)  # Make a field active for alarm