Django在特定时间段后自动更新记录

时间:2019-03-22 11:12:23

标签: django django-models

我有一个模型“ Grade”,其中有一个字段:“ name”。我也有这个年级的一个实例。即“一年级”。有没有一种方法可以在给定时间段(假设是一年)之后自动将该特定实例更新为“二级”及其所有其他相关模型,然后在另一年后将其更改为“三级”,依此类推上吗?

2 个答案:

答案 0 :(得分:1)

您可以使用celery

定义异步/定期任务

使用芹菜,您可以将任务设置为在特定时间运行,因此可以将任务计划为在当前时间之后恰好一年运行。或者,如果您愿意,可以安排定期任务每天运行,遍历已过期的“等级”对象并更新它们。

答案 1 :(得分:1)

一种更好的方法是将名称字段替换为“ class_of”字段,该字段包含希望学生毕业的整数年份(例如“ 2020届”)。这样,无论何时进行计算:

MAX_GRADE - (student.class_of - CURRENT_YEAR)

您将获得当前成绩。无需运行计划的作业等。

要使它更加美观,请在模型中进行上述更改后,将以下内容添加到模型类中:

# At the top of models.py:
from django.utils import timezone


# Elsewhere in your model:
MAX_GRADE = 12


# In your model
@property
def name(self):
    return "Grade" + str(MAX_GRADE - (self.class_of - timezone.now().year))

这样,当您调用student.name时,它将始终显示正确的成绩。缺点是您必须开始使用class_of进行查询,并且如果要计算大量学生的成绩,效率会稍低。但是,与设置任务计划程序和cron作业以及如果管理不当可能导致的错误相比,这是值得的。