У меня есть проект с Django, и я использую Pillow для хранения изображений в некоторых моделях, но я хочу, чтобы эти изображения хранились в сжатом виде. Как я могу указать Pillow сжимать изображения при их сохранении в модели ImageField?
Это пример модели с ImageField:
class Photo(models.Model):
name = models.CharField(max_length=100, null=True, blank=True, verbose_name=_("Name"))
album = models.ForeignKey(Album, on_delete=models.PROTECT, related_name='photos', verbose_name=_("Album"))
photo = models.ImageField(verbose_name=_("Photo"))
class Meta:
verbose_name = _("Photo")
verbose_name_plural =_("Photos")
def __str__(self):
return "[{}] {}".format(self.pk, self.name)
Я вижу сохраненный файл и вижу, что он имеет тот же размер, что и исходный исходный файл.
Я использую Фреймворк Django Rest для получения изображений из интерфейса.






Вы можете переопределить метод save модели:
from PIL import Image
class Photo(models.Model):
name = models.CharField(max_length=100, null=True, blank=True, verbose_name=_("Name"))
album = models.ForeignKey(Album, on_delete=models.PROTECT, related_name='photos', verbose_name=_("Album"))
photo = models.ImageField(verbose_name=_("Photo"))
def save(self, *args, **kwargs):
instance = super(Photo, self).save(*args, **kwargs)
image = Image.open(instance.photo.path)
image.save(instance.photo.path,quality=20,optimize=True)
return instance
Вам нужен сигнал post_save, потому что вам нужно, чтобы экземпляр был сохранен раньше, чтобы иметь путь к фотографии.
Можно ли добиться того же результата с помощью приемника pre_save?