In my blog, there are some recurring tasks (such as e.g. the refresh of the Covid19 statistics).

They are implemented as management tasks by implemeting them under the app in covid/management/commands/refresh_covid.py:

covid/management/commands/refresh_covid.py

from django.core.management.base import BaseCommand

class Command(BaseCommand):

    help = 'Refreshes the covid info in the database'

    def handle(self, *args, **options):
        self._log_info("Refreshing the covid info")
        # Run the actual refresh routine
        self._log_info("Refreshed the covid info")

    def _log_info(self, *msg):
        full_msg = ' '.join(msg)
        self.stdout.write(self.style.SUCCESS(full_msg))

By implementing the commands this way, I can easily run them using manage.py:

$ ./manage.py refresh_covid

However, when I want to trigger them manually or execute them automatically using tools such as apscheduler, you need a way to call them from code.

This can be achieved by using the django.core.management module:

from django.core import management
from apscheduler.schedulers.background import BackgroundScheduler

def hourly_covid_refresh():
    management.call('refresh_covid')

def start():
    scheduler = BackgroundScheduler()
    scheduler.add_job(hourly_covid_refresh, 'cron', minute='0', hour='*', day='*', week='*', month='*')
    scheduler.start()