Могу ли я запустить задачу Celery на обновление таблицы в Django?
Например, у меня есть модель:
class SomeModel(model.Model):
is_active = BooleanField(default=False)
...
Возможно ли вызвать задачу Celery при изменении is_active на True? Самое главное здесь то, что мне нужно, чтобы задача срабатывала независимо от того, как изменился is_active, будь то изменение через shell, админ панель, вызов api и т.д. Используемая мной БД - psql.
Для этого можно использовать сигналы. Сложная часть заключается в определении того, что ваше поле действительно изменилось в процессе. В этом случае нужно сделать вызов refresh_from_db для сравнения значений в pre_save. Это немного муторно, но работает
это будет так
@receiver(pre_save, sender=SomeModel)
def access_rule_card_pre_save(sender, instance: SomeModel, *args, **kwargs):
old = copy.copy(instance).refresh_from_db()
changed = instance.is_active != old.is_active
# you can send task here, or save changed to instance._changed and work with it in post_save
Другой подход - использование отдельной библиотеки, например https://github.com/rsinger86/django-lifecycle
В вашем случае вы можете создать хук таким образом
@hook(AFTER_UPDATE, when="is_active", has_changed=True)
def on_active_change(self):
# send celery task here