【问题标题】:Trigger Django module on Database update在数据库更新时触发 Django 模块
【发布时间】:2013-03-29 21:28:12
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 如果您的用例是简单的更新等,我会推荐 django 信号。
  • 为什么每次保存记录时不让celery对方法进行排队?

标签: python database django sqlite triggers


【解决方案1】:

创建一个 celery 任务来做任何你需要对对象做的事情:

tasks.py

from celery.decorators import task

@task()
def foo(object):
    object.do_some_calculation()        

然后创建一个django signal,每次保存模型实例时都会触发它,在 Celery 中排队你的任务:

models.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)

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

【讨论】:

  • 啊,我没有注意到说记录在 Django 应用程序之外更新/保存的注释,所以这个答案不起作用,但可能对其他有类似查询但有django 中的更新/保存
【解决方案2】:

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

但如果这不是一个选项,让 celery 查询数据库以查找是否有更改可能是下一个最佳选择。 (肯定比从数据库中调用 Web 服务作为触发器的其他可能选项要好,您应该避免这样做。)

【讨论】:

    猜你喜欢
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 2014-09-16
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    相关资源
    最近更新 更多