tgoop.com/djangolearn_ir/1097
Create:
Last Update:
Last Update:
پیرو پست قبلی، یکی پرسید اون ContentType چیه و کارش چیه؟
اگه دقت کرده باشید توی INSTALLED_APPS یه اپ هست به اسم django.contrib.contenttypes و به واسطه این وقتی migrate می کنید، یه جدول به اسم django_content_type ساخته میشه. که همه مدل های پروژه رو توش نگهداری می کنه.
حالا اگه این لینک رو ببینید:
https://docs.djangoproject.com/en/5.2/ref/contrib/contenttypes/#generic-relations
درباره جنریک ریلیشن توضیح داده یا GenericForeignKey که اشاره میکنه به content_type
مزیت ش چیه این جنریک ریلیشن؟
یک مثال از chatgpt برای comment :
فرض کن میخوای یه سیستم کامنت داشته باشی.
کاربر میتونه روی محصول کامنت بذاره.
یا روی پست بلاگ.
یا روی سفارش.
راه سنتی (بدون Generic):
یا باید برای هر مدل یه فیلد ForeignKey بسازی:
class Comment(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
product = models.ForeignKey(Product, null=True, blank=True, on_delete=models.CASCADE)
blog = models.ForeignKey(Blog, null=True, blank=True, on_delete=models.CASCADE)
order = models.ForeignKey(Order, null=True, blank=True, on_delete=models.CASCADE)
👉 مشکل: کلی فیلد خالی داری و هر بار باید کد اضافه بزنی.
یا باید برای هر مدل یه مدل کامنت جدا بسازی (CommentForProduct, CommentForBlog, ...).
👉 مشکل: کلی جدول و کد تکراری.
📌 راه حل با Generic Relation
به جای این همه دردسر، با GenericForeignKey یه بار تعریف میکنی:
class Comment(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
text = models.TextField()
حالا content_object میتونه هر چیزی باشه (Product، Blog، Order و ...).
✅ مزیتهای Generic Relation
سادگی و انعطافپذیری: فقط یه جدول داری که میتونه به همهچی وصل بشه.
کاهش کد تکراری: به جای نوشتن چند مدل/فیلد مختلف، یه بار تعریف میکنی و برای همه استفاده میشه.
افزودن مدلهای جدید بدون تغییر دیتابیس: مثلاً اگه فردا خواستی روی Category هم کامنت بذاری، لازم نیست مدل Comment رو تغییر بدی؛ همون GenericForeignKey جواب میده.
یکپارچگی دادهها:همه کامنتها/لایکها/اکتیویتیها توی یه جدول جمع میشه → مدیریت و جستجو راحتتر.
⚠️ معایبش
کمی پیچیدگی بیشتر در Queryها (چون باید از ContentType کمک بگیری).
enforce کردن روابط در سطح دیتابیس سختتره (چون DB نمیدونه object_id دقیقاً به کدوم جدول اشاره میکنه).
BY جنگولرن
Share with your friend now:
tgoop.com/djangolearn_ir/1097
