1

データベースで新しいレコードを監視し、新しいレコードが挿入されたときに Django アプリケーションのコンテキストでメソッドを実行できるアプリケーションを開発したいと考えています。

Celeryタスクが最後のチェック以降の変更についてデータベースをチェックし、上記のメソッドをトリガーするアプローチを使用することを計画しています。

これを達成するためのより良い方法はありますか?

バックエンドとして SQLite を使用しており、apsw の setupdatehook API を試しましたが、モジュールが Django コンテキストで実行されないようです。

注: 更新は、Django 外部の別のアプリケーションによって行われます。

4

2 に答える 2

3

オブジェクトで必要なことは何でも行うセロリ タスクを作成します。

タスク.py

from celery.decorators import task

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

次に、モデルのインスタンスが保存されるたびに起動されるdjango シグナルを作成し、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関数は要求サイクル内で実行されますが、関数が行っていることは、Celery にバックグラウンドでqueue_task作業 ( ) の実際の内容を処理するように指示することだけです。do_some_calculation

于 2013-03-29T22:24:14.570 に答える
1

A better way would be to have that application that modifies the records call yours. Or at least make a celery queue entry so that you don't really have to query the database too often to see if something changed.

But if that is not an option, letting celery query the database to find if something changed is probably the next best option. (surely better than the other possible option of calling a web service from the database as a trigger, which you should really avoid.)

于 2013-03-29T22:23:57.137 に答える