Python 数据库更新时触发Django模块

Python 数据库更新时触发Django模块,python,database,django,sqlite,triggers,Python,Database,Django,Sqlite,Triggers,我想开发一个应用程序来监视数据库中的新记录,并允许我在插入新记录时在Django应用程序的上下文中执行一个方法 我计划使用一种方法,其中芹菜任务检查数据库自上次检查以来的更改,并触发上述方法 有没有更好的方法来实现这一点 我使用SQLite作为后端,并尝试了apsw的setupdatehook API,但它似乎没有在Django上下文中运行我的模块 注意:更新是由Django之外的其他应用程序进行的。更好的方法是让修改记录的应用程序调用您的应用程序。或者至少创建一个芹菜队列条目,这样您就不必经常

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

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

有没有更好的方法来实现这一点

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


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

更好的方法是让修改记录的应用程序调用您的应用程序。或者至少创建一个芹菜队列条目,这样您就不必经常查询数据库来查看是否有更改


但如果这不是一个选项,那么让芹菜查询数据库以发现是否发生了变化可能是下一个最佳选项。当然比从数据库调用web服务作为触发器的其他可能选项要好,您应该真正避免这种情况。

更好的方法是让修改记录的应用程序调用您的应用程序。或者至少创建一个芹菜队列条目,这样您就不必经常查询数据库来查看是否有更改


但如果这不是一个选项,那么让芹菜查询数据库以发现是否发生了变化可能是下一个最佳选项。当然比从数据库中调用web服务作为触发器的其他可能选项要好,您应该真正避免这种情况。

创建芹菜任务,以执行您需要对对象执行的任何操作:

tasks.py

然后创建一个在每次保存模型实例时都会触发的,将您的任务在芹菜中排队:

models.py


需要注意的是,django的信号是同步的,换句话说,queue_任务函数在请求周期内运行,但是queue_task函数所做的只是告诉芹菜处理实际的工作,在B后台进行一些计算创建芹菜任务,以执行您需要对对象执行的任何操作:

tasks.py

然后创建一个在每次保存模型实例时都会触发的,将您的任务在芹菜中排队:

models.py


需要注意的是,django的信号是同步的,换句话说,queue_task函数在请求周期内运行,但是queue_task函数所做的只是告诉Cellery处理实际的工作,如果您的用例是简单的更新,请在B后台进行一些计算,etc我会推荐django信号。为什么不让方法在每次保存记录时由芹菜排队?如果您的用例是简单的更新,etc我会推荐django信号。为什么不让方法在每次保存记录时由芹菜排队?啊,我没有注意到注释中说记录是在Django应用程序之外更新/保存的,所以这个答案不起作用,但可能对其他类似查询的人有用,但对于djangoAh内的更新/保存,我没有注意到注释中说记录是在Django应用程序之外更新/保存的,所以这个答案不起作用,但对于其他具有类似查询但在django中进行更新/保存的用户可能有用
from celery.decorators import task

@task()
def foo(object):
    object.do_some_calculation()        
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)