• 1400/01/30

پیاده سازی مدل product :

سلام استاد. وقتتون بخیر. دارم یه سایتی رو پیاده سازی میکنم که میتونه شامل انواع مختلف محصول باشه (تقریبا مثل دیجی کالا). مثلا میتونه موبایل، کتاب، لپ تاپ، میز و... داشته باشه.

میخواستم برای همشون فقط یه مدل Product بسازم و همه محصولات از روی این ساخته بشن. ولی دیدم اگه این کار رو بکنم فیلدهایی که بعنوان feature هر محصول ساختم خیلی زیاد میشن و خیلی موقع ساخت یه محصول جدید بی استفاده میشن. چون مثلا اگه من بخوام یه کتاب بسازم باید مثلا فیلدی که مربوط به تعداد صفحاتشه رو پر کنم ولی مثلا فیلدهایی که مربوط به لپ تاپ و موبایل و... هستن، کلا بی استفاده میشن.

به همین دلیل یه مدل Product ساختم که فیلدهای کلی مثل اسم محصول، عکس های محصول، دسته بندی، توضیحات محصول و... رو براش تعریف کردم و برای هر محصول (موبایل، کتاب، لپ تاپ و...) یه مدل جدا ساختم که این مدل از مدل Product ارث بری میکنه. به این صورت:

class Product(models.Model):
    name = models.CharField(max_length=120)


    price = models.IntegerField()
    description = models.TextField()
    #...
    class Meta:
        abstract = True
        
class MobileProduct(Product):
    # Fields that are specific to this product
    
class BookProduct(Product):
    # Fields that are specific to this product
    
class NotBookProduct(Product):
    # Fields that are specific to this product

حالا میخواستم بدونم آیا این روش و راه حلی که من پیاده سازی کردم روش درستیه یا شما راه حل بهتری رو سراغ دارید؟

خیلی ممنون میشم راهنماییم کنید

  • 1400/02/02
  • ساعت 11:09

سلام وقت شما بخیر

این شیوه که شما پیاده سازی غلط نیست ولی تصور کنید در ادامه محصول جدیدی به سایت شما اضافه میشه مثلا لباس اونوقت میخواد برید دوباره یه مدل برای لباس بسازید ؟

محصولات باید تماما داینامیک و از ادمین مدیریت بشن .

کاری که میتونید بکنید اینه که یه مدل بسازید به عنوان productCategory و داخل مدل محصول به این مدل فارنکی بزنید . 

در ادامه مدل دیگه ای میسازید به عنوان ویژگی های محصولات که مشخص می کنید هر دسته بندی لیستی از ویژگی هارو میتونه داشته باشه .

 جداول ما به این صورت میشن :

class ProductProperties(models.Model):
	title = ...
	
class ProductCategory(models.Model):
	title = ...
	properties = models.ManyToManyField(ProductProperties)

class Product(models.Model):
	Other Fields ...
	category = models.ForeginKey(ProductCategory, ondelete=models.CASCADE)

به این صورت شما لیستی از ویژگی های داینامیک برای دسته بندی های مختلف از محصولاتتون دارید میمونه پر کردن این ویژگی ها که میتونید یه جدول دیگه بسازید براش به این صورت :

class SetProductProperty(models.Model):
	product= models.ForeginKey(Product, ondelete=models.CASCADE)
	property = models.ForeginKey(ProductProperties, ondelete=models.CASCADE)
	value = models.Charfield(max_length=250)

قطعا راه های بهتر و بهینه تری نسبت به این که من گفتم هست که میتونید سرچ کنید و پیدا کنید 

ولی با این ساختار هر دسته بندی ویژگی های خودشو داره و شما میدونید باید چه ویژگی هایی رو برای محصول پر کنید و اینکه شما محدود به محصول خاصی نیستید و همه محصولات شما داینامیک ویژگی های خودشون رو دارن

برای مدیریت این بخش بهتره ادمین اختصاصی بزنید و اونطور که دوست دارید روال افزودن محصول رو پیاده سازی کنید

موفق باشید


  • 1400/02/02
  • ساعت 18:54

خیلی ممنونم از راهنماییتون

بنظر خودم هم راه‌حل شما بهتره. فقط خیلی متوجه کاربرد مدل SetProductProperty نشدم. کابردش دقیقا چیه؟


  • 1400/02/03
  • ساعت 02:27

خیلی خوب توضیح دادین ایول کیف کردم 

ست پروداکت پروپرتی واضح بود که

برای محصولاتی مثل موبایل مشخصا ویژگی هایی مختلفی مد نظره که همون ها برای لباس کارایی نداره این مدل صرفا پروپرتی هایی که مد نظر شماس رو شامل میشه که می خواید اضافه کنید که می تونن اجباری باشن یا نباشن 

اگه بخوام بهتر توضیح بدم اینطوری میشه که شما 

مدل محصول دارین و با این مدل می تونید ویژگی به مدل محصول اصلی اضافه کنید و چون یه جدول توی دیتا بیس درست می کنه می تونید در آینده هم به مدل محصولاتتون ویژگی های دیگه  ای اضافه کنید


  • 1400/02/03
  • ساعت 02:42

ویژگی ها باید یک مقداری داشته باشن دیگه 

کار SetProductProperty پر کردن این مقدار هاس

مثلا ما میایم ویژگی رزولوشون صفحه نمایش رو برای دسته بندی موبایل تعریف می کنیم

حالا یک موبایلی داریم که این ویژگی رو داره

خب حالا رزولوشنش چند هست ؟

کار این SetProductProperty  همینه میاد یک محصول رو انتخاب میکنه (اینجا موبایل) و یک ویژگی رو انتخاب میکنه (رزولوشن) و مقدارش رو وارد میکنیم که براش نمایش بده

 


  • 1400/02/03
  • ساعت 17:07

خیلی ممنونم از توضیح هردوتون

الان کاملا متوجه شدم

فقط بنظرتون برای پیاده‌سازی این روش الزاما به ادمین پنل اختصاصی نیاز داریم؟ و اگه نیاز داریم چطور میتونم پیاده‌سازی ادمین‌پنل رو یاد بگیرم؟


logo-samandehi