2013-03-29 1 views
0

Je souhaite développer une application qui surveille la base de données pour de nouveaux enregistrements et me permet d'exécuter une méthode dans le contexte de mon application Django lorsqu'un nouvel enregistrement est inséré.Déclencher le module Django sur la mise à jour de base de données

Je prévois d'utiliser une approche où une tâche Celery vérifie la base de données pour les changements depuis la dernière vérification et déclenche la méthode ci-dessus.

Existe-t-il un meilleur moyen d'y parvenir? J'utilise SQLite comme backend et j'ai essayé l'API setupdatehook d'apsw, mais il ne semble pas que mon module fonctionne dans un contexte Django.

REMARQUE: Les mises à jour sont effectuées par une application différente de Django.

+0

si votre usecase est des mises à jour simples, etc. Je recommanderais des signaux de django. – karthikr

+0

Pourquoi ne pas faire mettre la méthode en attente par céleri à chaque fois qu'un enregistrement est sauvegardé? –

Répondre

0

Une meilleure solution serait d'avoir cette application qui modifie les enregistrements appelle le vôtre. Ou faites au moins une entrée dans une file d'attente de céleri afin de ne pas avoir à interroger la base de données trop souvent pour voir si quelque chose a changé.

Mais si ce n'est pas une option, laisser celery interroger la base de données pour trouver si quelque chose a changé est probablement la meilleure option suivante. (. Sûrement mieux que l'autre option possible d'appeler un service Web à partir de la base de données comme un déclencheur, que vous devriez vraiment éviter)

2

Créer une tâche de céleri pour faire quoi que ce soit que vous devez faire avec l'objet:

tasks.py

from celery.decorators import task 

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

Ensuite, créez un django signal qui est tiré chaque fois qu'une instance de votre modèle est enregistré, faire la queue dans votre tâche Céleri:

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) 

Ce qui est important de noter que est les signaux de django sont synchrones, en d'autres termes la fonction queue_task exécute dans le cycle de demande, mais toute la fonction queue_task fait est de dire Céleri pour gérer les tripes réels du travail (do_some_calculation) dans le fond de theb

+0

Ah, je n'ai pas remarqué la note qui dit que les enregistrements sont mis à jour/sauvegardés en dehors de l'application Django, donc cette réponse ne fonctionnera pas mais pourrait être utile pour d'autres requêtes similaires mais avec les mises à jour/sauvegardes dans django –

Questions connexes