🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ علیرضا سلیمان
تعداد تصاویر
محسن موحد حل شده توسط محسن موحد

سلام وقت بخیر، استاد فرمودن که اگر خواستیم از چند تصویر استفاده کنیم نباید چندین imageField بنویسیم اما مسئله من این هست که برای یک سایت تنیس در قسمت مسابقات، دو بازیکن باید عکس جدا داشته باشند ایا میتونم به این صورت کد رو بنویسم؟ (منظورم دوتا imageField هست = player_image1  و player_image2) کد درست کار میکنه اما از لحاظ بهینه و درست بودنش شک دارم ممنون میشم راهنمایی کنید.

 

class TennisMatch(models.Model):
    tournament = models.ForeignKey(Tournament, on_delete=models.SET_NULL, null=True, blank=True, related_name='matches', verbose_name="دوره مسابقات", default=Tournament.objects.first().pk)
    player1 = models.CharField(max_length=100, verbose_name='بازیکن اول')
    player2 = models.CharField(max_length=100, verbose_name='بازیکن دوم')
    player_image1 = models.ImageField(null=True, blank=True, upload_to='players/', verbose_name='عکس بازیکن اول')
    player_image2 = models.ImageField(null=True, blank=True, upload_to='players/', verbose_name='عکس بازیکن دوم')
    winner = models.CharField(max_length=100, blank=True, null=True, verbose_name='برنده',)
    

سلام،

++ اگر یه بازیکن توی چندین مسابقه شرکت کنه (مثلاً "علی محمدی" توی مسابقه ۱، ۲ و ۳ بازی کنه)، هر بار باید عکسش رو توی هر مسابقه جداگونه آپلود کنی (player_image1 یا player_image2). این باعث می‌شه:

++ فضای ذخیره‌سازی بیشتری مصرف بشه (چون یه عکس برای یه بازیکن بارها ذخیره می‌شه).

++ اگر بخوای عکس بازیکن رو تغییر بدی، باید توی همه مسابقات تغییرش بدی (که سخته و احتمال خطا داره).

++ این برخلاف اصول نرمال‌سازی دیتابیس (Database Normalization) است، چون دیتای مربوط به بازیکن (مثل عکسش) باید یه بار ذخیره بشه و توی جاهای مختلف استفاده بشه.

++ اگر بعداً بخوای اطلاعات بیشتری به بازیکن‌ها اضافه کنی (مثلاً تاریخ تولد، ملیت، یا آمار عملکرد)، باید مدل TennisMatch رو تغییر بدی و فیلدهای بیشتری (مثل player1_birthdate، player2_birthdate) اضافه کنی. این باعث می‌شه مدلت شلوغ و غیرقابل‌مدیریت بشه.

++ اگر بعداً بخوای یه مسابقه تیمی تعریف کنی (مثلاً تیمی با ۴ بازیکن)، نیاز به اضافه کردن player_image3 و player_image4 داری، که طراحی رو پیچیده‌تر می‌کنه.

 

برای بهینه‌سازی مدل TennisMatch در جنگو، به جای استفاده از دو ImageField برای عکس بازیکن‌ها، باید یه مدل جداگونه به نام Player بسازی که اطلاعات بازیکن (مثل نام و عکس) رو ذخیره کنه. توی مدل TennisMatch، به جای فیلدهای player1, player2, player_image1 و player_image2، از ForeignKey برای ارجاع به مدل Player استفاده کن (مثلاً player1 = models.ForeignKey(Player, ...)). این روش از تکرار داده‌ها جلوگیری می‌کنه، فضای ذخیره‌سازی رو بهینه می‌کنه و مدیریت اطلاعات (مثل تغییر عکس یه بازیکن) رو ساده‌تر می‌کنه.
 

بهترین پاسخ
محسن موحد ۰۵ اردیبهشت ۱۴۰۴، ۲۳:۱۷