فرض کنید که شما یک مدل دارید به اسم Workspace و فیلدی دارید که owner نام داره. یک مدل دیگه ای دارید که Memberships هستش که ارتباط بین کاربران و Workspace رو مدیریت میکنه و نقش کاربر هارو مثل owner, admin یا member رو ذخیره میکنه.
میخوایم کدی رو پیاده سازی کنیم که وقتی تغییر مالکیت workspace از کاربری به کاربر دیگه ای انتقال پیدا کرد، فیلد owner در مدل workspace هم آپدیت بشه.
مشکلی که اینجا وجود داره، زمانی که نقش مالکیت تغییر بکنه، در مدل workspace فیلد owner آپدیت نمیشه و همچنان مالک قبلی رو نشون میده. توی چنین موقعیتی میتونیم از سیگنال ها استفاده کنیم. این امکان رو برای ما فراهم میکنه که به نوعی، به تغییرات مدل ها واکنش نشون بدیم مثل بعد از ذخیره شدن شیء(post_save)
مدل ها به این صورت هستند:
سیگنال رو طوری تعریف می کنیم که که هر زمان یک Membership با نقش owner ذخیره شد، فیلد owner در مدل Workspace هم آپدیت بشه.
فایل "signals.py" به این صورت هستش:
ما توی این بخش از سیگنال post_save
استفاده کردیم که به صورت خودکار هر زمان که یک Membership ذخیره بشه، کدی رو اجرا میکنه. سیگنال post_save
این امکان رو میده که بعد از ذخیره موفقیتآمیز یک شیء در دیتابیس، به تغییرات واکنش نشان بدیم.
این کد میاد هر بار که یک Membership با نقش owner
ذخیره بشه، فیلد owner
در مدل Workspace رو بهروزرسانی میکنه. به این صورت که اگر کاربری به عنوان مالک جدید تعیین بشه، سیگنال به صورت خودکار مالک فعلی رو تغییر میده و تغییرات رو در دیتابیس ذخیره میکنه. این کار باعث میشه دادهها همیشه هماهنگ باشن و نیازی به بهروزرسانی دستی در جاهای مختلف نباشه.
برای اتصال سیگنال هم باید تغییراتی داخل فایل apps.py انجام بدیم:
حالا وقتی بخوایم تغییر مالکیت انجام بدیم، فیلد owner در مدل Workspace هم به صورت خودکار آپدیت میشه و دچار ناسازگاری در دیتا نمیشیم.