数据库更新时触发 Django 模块

use*_*488 1 python sqlite django triggers apsw

我想开发一个应用程序来监视数据库中的新记录,并允许我在插入新记录时在 Django 应用程序的上下文中执行一个方法。

我计划使用一种方法,其中 Celery 任务检查数据库自上次检查以来的更改并触发上述方法。

有更好的方法来实现这一目标吗?

我使用 SQLite 作为后端并尝试了 apsw 的 setupdatehook API,但它似乎没有在 Django 上下文中运行我的模块。

注意:更新是由 Django 之外的不同应用程序进行的。

Tim*_*ony 5

创建一个 celery 任务来执行您需要对对象执行的任何操作:

任务.py

from celery.decorators import task

@task()
def foo(object):
    object.do_some_calculation()        
Run Code Online (Sandbox Code Playgroud)

然后创建一个django 信号,每次保存模型实例时都会触发该信号,在 Celery 中对任务进行排队:

模型.py

class MyModel(models.Model):
    ...

from django.db.models.signals import post_save
from django.dispatch import receiver
from mymodel import tasks

@receiver(post_save, sender=MyModel)
def queue_task(sender, instance, created, **kwargs):
    tasks.foo.delay(object=instance)
Run Code Online (Sandbox Code Playgroud)

需要注意的是,django 的信号是同步的,换句话说,该queue_task函数在请求周期内运行,但该函数所做的只是告诉 Celery在后台queue_task处理工作的实际内容 ( )do_some_calculation