Различные crontab для каждого объекта одной модели Django с использованием сельдерея - PullRequest
1 голос
/ 02 мая 2019

Я могу создать celery_beat_schedule, и он работает. YAY!

Но мне было интересно, есть ли способ создать cronjob для разных объектов одной и той же модели Django.

Settings.py

CELERY_BEAT_SCHEDULE = {
    'ok': {
        'task' : 'bill.tasks.ok',
        'schedule' : crontab(minute=27, hour=0),
        # 'args' : (*args)
    }
}

Счет / tasks.py

from celery import task
@task
def ok():
    bills = Bill.objects.all()
    for bill in bills:
        perform_something(bill)
  • Я хотел изменить время crontab для каждого объекта. Как я могу это сделать?

  • Предположим, у меня есть значение часа и минуты в объекте модели

Спасибо за ваше время:)

Ну, я бы не смог найти, как запустить разные crontab для каждого экземпляра задачи. Но есть и другой способ бежать. Просто запускайте ваш crontab каждый час и каждый раз проверяйте, совпадает ли ваш запрос с текущим временем в tasks.py .

1 Ответ

0 голосов
/ 02 мая 2019

Вы можете указать значения в аргументах, а затем использовать их при фильтрации QuerySet.

Settings.py

CELERY_BEAT_SCHEDULE = {
    'ok_27_0': {
        'task' : 'bill.tasks.ok',
        'schedule' : crontab(minute=27, hour=0),
        'args' : (27, 0)
    },
    'ok_5_any': {
        'task' : 'bill.tasks.ok',
        'schedule' : crontab(minute=5),
        'args' : (5, None)
    }
}

банкнота / tasks.py

from celery import task
@task
def ok(minute=None, hour=None):
    bills = Bill.objects.all()

    if minute is not None:
        bills = bills.filter(minute=minute)
    if hour is not None:
        bills = bills.filter(hour=hour)

    for bill in bills:
        perform_something(bill)

Edit:

Вы также можете попробовать связать задачу и посмотреть, сможете ли вы найти расписание для задачи в экземпляре задачи или в ее запросе. Таким образом, вам не придется повторяться в настройках. Однако я не знаю, возможно ли это.

@task(bind=True)
def ok(self):
    self.request
...