每天在 Django 中更新模型的所有实例

Updating all instances of a model everyday in Django

首先,我知道这不是一般的“Whosebug”类型的问题,但我找不到另一个好的网站来提出这个问题。我个人认为这是一个非常合理的问题,所以我希望你能在这里帮助我。基本上,您如何在 Django 中每天更新所有模型实例?现在,我有一个模型,其中包含我每个学生的信息。我想每天更新每个学生的信息,以便每天在 django 的日程表中显示正确的学生。例如,如果是假期,则每个学生模型中的“显示在我的列表中”字段将更新为 false。当然,我要增加很多功能,比如“今天是假期吗?”,“学生今天有class吗?”,“学生什么时候有class 今天和我一起?”等。如果学生符合所有要求(或功能)以“显示”在我的日程表中,则每个学生模型中的“显示在我的列表中”字段将更新为 true .然后,我的日程表列表将遍历我的所有学生,只显示“在我的列表中显示”字段 = True 的学生。所以,我需要一个函数(或函数列表)来每天更新我的每个模型实例。关于如何做到这一点的任何想法或建议?一个 link 到一个视频,它展示了我如何做到这一点,也将不胜感激。我研究了计划任务,但我并不真正了解它们。由于我是初学者,我也希望有一种“简单的方法”来完成这项任务。谢谢大家!

向您的 django 项目添加后台和周期性任务的最佳方式是 Celery。 Celery 与 django 集成,您可以非常快速地进行基本设置。 Celery 提供了 beat - 一个调度程序,它将向代理(Redis 或 RabbitMQ)中的队列、工作进程或进程池发出消息,该消息将从代理中的队列中读取消息并执行必要的任务.查看文档以获取示例。

另一种方式 - 它是一个简单的线程,可以从您的 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()