آرگومان on_delete از ForeignKey در Django

با سلام و درود و امیدوارم ایام به کامی در این روز های گرم پایان بهار داشته باشید 🙂 سریع میرم سر اصل مطلب، قضیه از اینجا شروع شده که Djangoبعد از ورژن ۲.۰ برای ForeignKey دو آرگومان اجباری در نظر گرفت و اگر مثل سابق کد می زدید احتمالا با ارور زیر مواجه می شدید:

TypeError: __init__() missing 1 required positional argument: 'on_delete'

پس در  Django 2.0 برای فیلد ForeignKey باید از دو آرگومان ضروری استفاده کنیم :

  • ۱- مدلی که میخواهیم بهش mapشیم
  • ۲- آرگومان on_delete

و اما on_delete چیست ؟

ForeignKey.on_delete

زمانی که شیئی که توسط ForeignKey بهش رفرنس داده ایم پاک می شود، Djangoمطابق با آرگومان on_delete رفتار خواهد کرد.

مقادیر ممکن برای on_delete :

مقادیر ممکن در django.db.models قابل دسترس هستند:

Django در این حالت، پس از حذف مرجع(رفرنس)، شیئی که آن کلید خارجی را داشته نیز پاک می کند.

اچاره پاک کردن مرجع (رفرنس) را با بلند کردن ProtectedError که زیر کلاسی از django.db.IntegrityError را نمی دهد.

کلید خارجی را برابر با Null قرار می دهد، این حالت فقط زمانی ممکن است که Nullبرای با True باشد.

مقدار کلید خارجی را برابر با مقدار پیشفرض آن قرار می دهد. مقدار پیشفرض برای کلید خارجی باید تعریف شده باشد.

مقدار کلید خارجی را برابر با مقداری که set()می دهد قرار می دهد.

عملی انجام نمی دهد. اگر بَکِند (backend) پایگاه داده شما مجبور به اجرای referential integrity باشد، این منجر به IntegrityError  خواهد شد. مگر شما به صورت دستی ON DELETE  در پایگاه داده اضافه کنید