我可以在 Django 中的 table 更新时触发 Celery 任务吗?

Can I trigger Celery task on table update in Django?

比如我有一个模型:

class SomeModel(model.Model):
    is_active = BooleanField(default=False)
    ...

是否可以在is_active变为True时触发Celery任务?这里最重要的是,无论 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