2013-03-29 2 views
0

데이터베이스를 모니터링하여 새로운 레코드를 만들고, 새로운 레코드가 삽입 될 때 장고 응용 프로그램의 컨텍스트에서 메소드를 실행할 수있는 응용 프로그램을 개발하고 싶습니다.데이터베이스 업데이트시 Django 모듈 트리거

Celery 태스크가 최종 점검 이후 변경 사항에 대해 데이터베이스를 점검하고 위의 f}을 트리거하는 f}을 사용할 계획입니다.

더 좋은 방법이 있나요?

SQLite를 백엔드로 사용하고 apsw의 setupdatehook API를 사용해 보았지만 장고 컨텍스트에서 내 모듈을 실행하지 않는 것 같습니다.

참고 : 업데이트는 장고 외부의 다른 응용 프로그램에서 수행합니다.

+0

당신의 usecase가 간단한 업데이 트라면, 나는 django 신호를 권하고 싶습니다. – karthikr

+0

레코드가 저장 될 때마다 셀 룰러가 대기하는 이유는 무엇입니까? –

답변

0

더 나은 방법은 레코드를 수정하는 응용 프로그램을 호출하는 것입니다. 또는 적어도 셀러리 대기열 항목을 작성하여 데이터베이스가 너무 자주 조회되어 변경된 사항이 있는지 실제로 확인하지 않아도됩니다.

하지만 옵션이 아닌 경우 셀러리가 데이터베이스에 쿼리하여 변경된 것이 있는지 확인하는 것이 가장 좋은 방법 일 것입니다. (확실하게 피해야하는 데이터베이스에서 웹 서비스를 호출하는 다른 가능한 옵션보다 확실합니다.)

2

개체와 관련하여 필요한 모든 작업을 수행하려면 셀러리 작업을 만듭니다.

from celery.decorators import task 

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

이 그런 다음 모델의 인스턴스가 저장 될 때마다 해고되는 django signal을 만들 tasks.py, 셀러리에서 작업을 대기열 :

models.py 그 장고의 신호가 queue_task 함수는 요청주기 내에서 실행 즉, 동 기적입니다주의하는 것이 중요하지만, 모든 queue_task 기능은 실제 배짱을 처리하기 위해 셀러리를 말하고 일을 무엇

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) 

theb 배경에있는 작품 (do_some_calculation)

+0

아, 나는 Django 앱 외부에서 레코드가 업데이트/저장된다는 메모를 보지 못했기 때문에이 답변은 작동하지 않지만 비슷한 검색어를 가진 다른 사용자에게는 유용 할 수 있지만 django 내에서 업데이트/저장합니다 –

관련 문제