Blog of science and life

Contact
Archives
Feed

Django Signal + Celery


Nếu bạn muốn dùng Celery task trong các Signals của Django, bạn cần làm như sau để tránh tình trạng bắn task quá nhanh, khiến bên trong task nếu query pk=id sẽ bị lỗi NotFound (do dữ liệu chưa kịp lưu vào database).

from django.db import transaction
from .models import MyModel
from .tasks import task

@receiver(post_save, sender=MyModel)
def my_model_post_save(sender, instance, **kwargs):
    transaction.on_commit(lambda: task.delay(args=(instance.id,)))

Ở đây ta đợi transaction commit xong mới chạy task. Problem solved.

Read more