Как предотвратить изменение размера изображения при каждом сохранении объекта в dadtabase?

У меня эта модель:

class Book(models.Model):
   title = models.CharField(max_length=256)
   price = models.IntegerField()
   category = models.ForeignKey('Category', on_delete=models.PROTECT)
   rating = models.FloatField(validators=[MaxValueValidator(10), MinValueValidator(1)])
   discount = models.IntegerField(blank=True, default=0)
   final_price = models.IntegerField(blank=True)
   created_date = models.DateTimeField(auto_now_add=True)
   description = models.TextField(blank=True, null=True)
   count = models.IntegerField(default=0)
   author = models.ForeignKey('Author', on_delete=models.PROTECT)
   image = models.ImageField(upload_to=_get_product_cover_upload_path, null=True, blank=True)

   def resize_image(self):
       img = Image.open(self.image.path)
       img.thumbnail((300, 300))
       img_w, img_h = img.size
       background = Image.new('RGBA', (400, 400), (255, 255, 255, 255))
       bg_w, bg_h = background.size
       offset = ((bg_w - img_w) // 2, (bg_h - img_h) // 2)
       background.paste(img, offset)
       background.save(self.image.path)

   def __str__(self):
       return f'{self.title}'

   def save(self, *args, **kwargs):
       self.final_price = self.price * (100 - self.discount) / 100

       super().save(*args, **kwargs)
       self.resize_image()

все работает хорошо, но когда я изменяю модель книги, например, меняю цену, изображение становится меньше, чем в прошлый раз, и с каждым сохранением объекта оно становится все меньше... Как я могу это исправить?

У вас должно быть одно поле для "original_image" и одно поле для "thumbnail_image".

При сохранении вы берете оригинальное_изображение, изменяете его размер и сохраняете его в уменьшенном_изображении:

class Book(models.Model):
    title = models.CharField(max_length=256)
    price = models.IntegerField()
    category = models.ForeignKey('Category', on_delete=models.PROTECT)
    rating = models.FloatField(validators=[MaxValueValidator(10), MinValueValidator(1)])
    discount = models.IntegerField(blank=True, default=0)
    final_price = models.IntegerField(blank=True)
    created_date = models.DateTimeField(auto_now_add=True)
    description = models.TextField(blank=True, null=True)
    count = models.IntegerField(default=0)
    author = models.ForeignKey('Author', on_delete=models.PROTECT)
    original_image = models.ImageField(upload_to=_get_product_cover_upload_path, null=True, blank=True)
    thumbnail_image = models.ImageField(upload_to=_get_product_cover_upload_path, null=True, blank=True)

    def resize_image(self):
        img = Image.open(self.original_image.path)
        img.thumbnail((300, 300))
        img_w, img_h = img.size
        background = Image.new('RGBA', (400, 400), (255, 255, 255, 255))
        bg_w, bg_h = background.size
        offset = ((bg_w - img_w) // 2, (bg_h - img_h) // 2)
        background.paste(img, offset)
        background.save(self.thumbnail_image.path)

    def __str__(self):
        return f'{self.title}'

    def save(self, *args, **kwargs):
        self.final_price = self.price * (100 - self.discount) / 100

        super().save(*args, **kwargs)
        if not self.thumbnail_image:
            self.resize_image()
Вернуться на верх