DJANGOLEARN_IR Telegram 1097
جنگولرن
سوال: شما اسلایدر برای سایت تون چطوری می سازید؟ این پیشنهاد chatgpt بود: اگه می‌خوای اسلایدرت خیلی انعطاف‌پذیر باشه، می‌تونی از GenericForeignKey استفاده کنی که به هر مدل وصل بشه (محصول، مقاله، دسته‌بندی و …). from django.contrib.contenttypes.fields import…
پیرو پست قبلی، یکی پرسید اون 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 دقیقاً به کدوم جدول اشاره می‌کنه).
8👍6



tgoop.com/djangolearn_ir/1097
Create:
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

View MORE
Open in Telegram


Telegram News

Date: |

Add the logo from your device. Adjust the visible area of your image. Congratulations! Now your Telegram channel has a face Click “Save”.! How to create a business channel on Telegram? (Tutorial) Telegram channels fall into two types: To edit your name or bio, click the Menu icon and select “Manage Channel.” Select: Settings – Manage Channel – Administrators – Add administrator. From your list of subscribers, select the correct user. A new window will appear on the screen. Check the rights you’re willing to give to your administrator.
from us


Telegram جنگولرن
FROM American