تفاوت دو کد زیر چیست و کدام بهتر است؟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class MagAttachment(models.Model): file = models.FileField(upload_to='mag/attachments', verbose_name='فایل اصلی') thumbnail = models.ImageField(upload_to='mag/attachments', verbose_name="نمایه", blank=True, null=True) def __str__(self): return str(self.file.name) def delete(self, *args, **kwargs): if self.file: self.file.delete(save=False) if self.thumbnail: self.thumbnail.delete(save=False) super().delete(*args, **kwargs) def get_thumbnail_url(self): if self.thumbnail: return self.thumbnail.url return static('images/placeholder.PNG') |
و
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class MagAttachment(models.Model): file = models.FileField(upload_to='mag/attachments', verbose_name='فایل اصلی') thumbnail = models.ImageField(upload_to='mag/attachments', verbose_name="نمایه", default='mag/placeholder.JPG') def __str__(self): return str(self.file.name) def delete(self, *args, **kwargs): if self.file: self.file.delete(save=False) if self.thumbnail and self.thumbnail.name != 'mag/placeholder.JPG': self.thumbnail.delete(save=False) super().delete(*args, **kwargs) |
در کد اول اگر thumbnail توسط کاربر انتخاب نشود یک فایل از مسیر mag آپلود میشود. و هنگام پاک شدن آبجکت مربوطه، اگر این آبجکت دارای این فایل پیشفرض بود پاک نشود که البته در این کد مربوطه خود به خود پاک می شود. پس یک باگ وجود دارد. گذشته از این باگ اگر 1000 بار کاربر بدون thumbnail فایل آپلود کند 1000 فایل تکراری ذخیره میشود.
در ضمن اگر فایل بهر دلیلی پاک شود یا نام آن تغییر کند سیستم دچار مشکل میشود.
در کد دوم اما اگر کاربر فایلی انتخاب نکند هیچ فایل پیش فرضی آپلود نمیشود بنابراین فایل تکراری دیده نمی شود و فضا هدر نمی روند.
از طرفی یک فایل static پاک نشده و هرکجا یک سند thumbnail نداشته باشد با متد get_thumbnail_url این فایل نشان داده میشود و دیگر سیستم دچار باگهای ناخواسته نمی شود.