Я не вижу хорошего способа сделать это, потому что vanilla django_crontab позволяет заполнять crontab только из настроек.Вам лучше найти другой пакет, который позволяет то, что вы хотите.Но если у вас нет выбора, я думаю, что будет работать следующее:
my_crontab.py
from django_crontab.app_settings import Settings
from django_crontab.crontab import Crontab
from django.conf import settings
# function need to return crontab
# in the same format as settings.py
def populate_from_db():
# some db magic
return [('*/5 * * * *', 'myapp.cron.my_scheduled_job')]
class DBCronSettings(Settings):
def __init__(self, settings):
super().__init__(settings)
self.CRONJOBS = populate_from_db() #
class DBCrontab(Crontab):
def __init__(self, **options):
super().__init__(**options)
self.settings = DBCronSettings(settings)
Вам необходимо создать подкласс Crontab и Настройки.Заставьте DBCronSettings читать ваши задания cron из базы данных, а затем используйте эти настройки в вашем пользовательском DBCrontab.
Затем выполните свою собственную команду crontab.Обрабатывает метод точно так же, как и в базовой команде, но использует ваш класс DBCrontab вместо исходного.
command.py
from django_crontab.management.commands.crontab import Command as CrontabCommand
from my_crontab import DBCrontab as Crontab
class Command(CrontabCommand):
def handle(self, *args, **options):
"""
Dispatches by given subcommand
"""
if options['subcommand'] == 'add': # add command
with Crontab(**options) as crontab: # initialize a Crontab class with any specified options
crontab.remove_jobs() # remove all jobs specified in settings from the crontab
crontab.add_jobs() # and add them back
elif options['subcommand'] == 'show': # show command
# initialize a readonly Crontab class with any specified options
with Crontab(readonly=True, **options) as crontab:
crontab.show_jobs() # list all currently active jobs from crontab
elif options['subcommand'] == 'remove': # remove command
with Crontab(**options) as crontab: # initialize a Crontab class with any specified options
crontab.remove_jobs() # remove all jobs specified in settings from the crontab
elif options['subcommand'] == 'run': # run command
Crontab().run_job(options['jobhash']) # run the job with the specified hash
else:
# output the help string if the user entered something not specified above
print(self.help)
Также не забудьте удалить django_crontab из INSTALLED_APPS, если вы планируетеназвать вашу команду 'crontab'.