【问题标题】:Updating all instances of a model everyday in Django每天在 Django 中更新模型的所有实例
【发布时间】:2021-04-08 07:08:27
【问题描述】:
首先,我知道这不是一般的“stackoverflow”类型的问题,但我找不到另一个好的网站来问这个问题。我个人认为这是一个完全合理的问题,所以我希望你能在这里帮助我。基本上,如何在 Django 中每天更新所有模型实例?现在,我有一个模型,其中包含我每个学生的信息。我想每天更新每个学生的信息,以便正确的学生每天都会出现在我的 django 日程表中。例如,如果是假期,则每个学生模型中的“显示在我的列表中”字段将更新为 false。当然,我还要添加很多功能,比如“今天放假吗?”、“学生今天和我一起上课吗?”、“学生今天什么时候和我一起上课?”等。如果学生符合所有要求(或功能)以在我的日程表中“出现”,则每个学生模型中的“显示在我的列表中”字段将更新为 true。然后,我的日程表将循环遍历我的所有学生,以仅显示具有“在我的列表中显示”字段 = True 的学生。所以,我需要一个函数(或函数列表)来每天更新我的每个模型实例。关于如何做到这一点的任何想法或建议?一个视频链接,它显示了我如何做到这一点也将不胜感激。我研究了计划任务,但我并不真正了解它们。由于我是初学者,因此我也希望有一种“简单的方法”来完成这项任务。谢谢大家!
【问题讨论】:
标签:
django
django-models
django-views
django-forms
scheduled-tasks
【解决方案1】:
为您的 django 项目添加后台和周期性任务的最优选方式是Celery。 Celery 与 django 集成,您可以非常快速地进行基本设置。 Celery 提供了 beat - 一个调度程序,它将向代理(Redis 或 RabbitMQ)中的队列发出应该执行什么任务的消息,worker - 进程或进程池,将从代理中的队列中读取消息并执行必要的任务.查看文档以获取示例。
另一种方式 - 这是一个简单的线程,可以从您的 django 项目开始,并在您需要时执行必要的事情。如果您需要定期任务的唯一非常基本的设置并且您不想考虑经纪人和工人,则应该选择这种方式。例如在您的 app/apps.py 中:
class YourAppConfig(AppConfig):
def ready(self):
# avoid double execution by checking 'autoreload' variable
if environ.get('RUN_MAIN', None) == 'true':
return
from .scheduler import Scheduler
# scheduler will execute task every 10 seconds
thread = Thread(
daemon=True,
target=Scheduler(10).run
)
thread.start()
还有 scheduler.py,使用标准库中的sched:
from sched import scheduler
class Scheduler:
def __init__(self, delay: int):
self.delay = delay
self.scheduler = scheduler()
def run(self) -> None:
while True:
self.scheduler.enter(self.delay, 1, <some function>)
self.scheduler.run()