在我的模型中,我关心每个对象在数据库中的持续时间并标记为活动状态。因此,如果模型处于活动状态超过几天,它应该在对象名称出现的每个位置都给出一个警报图标。
目前我正在计算每个GET请求中所有对象的日期差异(今天 - 创建日期)。但我不认为这是正确的方法,因为当网站结束时我会有数千个对象。
进行此类检查的专业方法是什么? 谢谢
答案 0 :(得分:1)
让我们隔离你在每个GET请求上调用的检查函数。我们将该函数命名为run_checks()
run_checks()
应该做的是,在整个数据库或其子集上运行,例如从日期X到日期Y,取决于您的业务。如果可能,它应该做的另一件事:它应该持续检查的状态。例如。如果您使用图标标记,则可以MyModel.flagged = True/False
或MyModel.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