استفاده از دومدل برای کلید خارجی

سلام من مدل ادمین ها(نویسنده های سایت) و کاربران معمولی رو تو دوتا مدل جدا تعریف کردم. حالا میخوام تو مدل کامنت ها بگم کی جواب داده؟ ادمین یا کاربر؛ هر کی بود اسمشو نشون بدم. حالا سوالم اینه تو مدل کامنت ها چطور دوتا کلید خارجی واسه یه فیلد تعریف کنم؟ لطفا پیاده سازیش رو بگید ممنون.

با این شرایط بنظر من میتونی یک ستون boolean برای ادمین بودن یا نبودن کامنت اضافه کنی به کامنت‌ها و یک ستون کلید خارجی بذاری براشون و بین اینکه برای کدوم جدول هست سوئیچ کنی (احتمالا ORM این رو ساپورت نکنه). یا اینکه دوتا ستون کلید خارجی بذاری یکی به جدول ادمینا یکی به جدول کاربرا که بتونن null‌ هم باشن و وقتی دریافت کردی ببینی id ادمین داره یا id کاربر.
بشخصه بجای این کارا ترجیح میدم کاربرا و ادمین‌ها رو تجمیع کنم توی یک جدول.

1 Likes

در ادامه اگر بیشتر از دو نوع کاربر داری یک جدول roles که هر نوع کاربر تعریف کرده درست کن و برای جدول کاربر یک کلید خارجی اضافه کن مثل role_id

1 Likes

خیلی بهتر هست همونطور که سام گفت از Role استفاده کنی (که البته user میتونه رابطه many to many ‌هم داشته باشه با role). اما اگر به هر دلیلی اینکارو نکردی، برای این مدلی که خودت طراحی کردی polymorphic relationship به کار میاد.
یعنی توی جدول کامنت ها علاوه بر id کاربر type کاربر هم نگه دار .

ممنون از کمکتون و توضیحاتتون
چون تازه کارم این سوالو میپرسم؛ اگه یه جدول کلی برای کاربران بسازم و توش یه فیلدی واسه ادمین بودن یا نبودن بذارم، موقعی که بخوام یه ادمین به سایت اضافه کنم باید دستی این کارو بکنم؟و ایا این همه اون چیزیه که مشکلمو حل میکنه؟ در ادامه به مشکل نمیخورم؟

منظور شما رو از دستی اضافه کردن متوجه نمیشم
در کد شما باید بنویسی که برای کاربر admin
وقتی کاربر ساخته میشه اون فیلد رو true ذخیره کنید

منظورم این بود که اگه بعد یه مدت بخوام یه ادمین به سایتم اضاف کنم یا یکی رو حذف کنم باید اون فیلد رو توی دیتابیس خودم و به صورت دستی تغییر بدم ؟ یا اینکه یه if بذارم که اونی که لاگین کرده اگه ادمین بود بتونه ادمین جدید اضافه کنه؟ یا خودشو حذف کنه؟

و اولین کسی که ادمین میخواد بشه چطور باید اینکارو کنه

بستگی به خودتون داره اگه میخوای میتونی ui و پنل برای اینکار درست کنی

میتونی. یک صفحه برای اصطلاحا CRUD کاربرها بساز که فقط ادمین ها دسترسی داشته باشن و بتونن کاربر ها را ویرایش کنند. یا محدودتر، فقط بتونن ستون ادمین بودن را عوض کنند.
برای اینکه یک ادمین اول داشته باشی، میتونی توی جنگو seed تعریف کنی یک کاربر پیشفرضی خودش بسازه توی دیتابیس که فیلد ادمین true باشه مثلا.
این کار بهتریه، در ادامه اگر نیاز داشتی نقش‌های بیشتری داشته باشی بقول سام میتونی یک جدول هم برای role بسازی. ولی اگر فکر میکنی نیاز پیدا نمیکنی همون خوبه، صرفا یک ستون (فیلد) boolean اضافه کن.