Signal Dispatcher به ما این امکان رو میده که اگر توی یک اپلیکیشن اتفاقی افتاد اپلیکیشن های دیگه یا جاهای دیگه رو notify کنیم که اتفاقی انجام شه. مثلا فرض کنید که یک نفر به ما یک پیام میفرسته. اون وقت من باید یه نوتیفیکیشن دریافت کنم. روش کار این مدلیه که یک تکه کد میتونه sender باشه و چند تابع میتونن reciever باشن. در واقع وقتی یک چند تابع به یک event حساس هستن میتونن از این قابلیت استفاده کنن.
در پروژه ای وقتی مستندات در مدلی به نام Document ذخیره میشه و همزمان یک تاریخچه از این ذخیره شدن توی DocumentChangeHistory ذخیره میشه. مشکل اینه که میخام وقتی یک داکیومنت حذف میشه تاریخچه مرتبط با اون هم پاک شه.
برای این کار باید از Signal جنگو استفاده کرد. مثلا
1 2 3 4 5 6 7 8 9 |
from django.db.models.signals import post_delete from django.dispatch import receiver from config.models import Document, DocumentChangeHistory @receiver(post_delete, sender=Document) def delete_related_history(sender, instance, **kwargs): (DocumentChangeHistory.objects.filter(request_kwargs__has_key='doc_id'). filter(request_kwargs__doc_id=instance.id).delete()) |
توی کد بالا میگیم که اگر مدل Document چیزی ازش حذف شد. post_delete .اون وقت این بلاک کد اجرا بشه که در واقع از مدل تاریخچه ردیف مرتبط رو حذف میکنه.
باید توی app.py این رو تعریف کنیم. تا کار کنه.
1 2 3 4 5 6 7 8 9 |
from django.apps import AppConfig class ManageConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'man' def ready(self): from .signals import delete_related_history |