Повторная загрузка изображения по умолчанию при создании новой учетной записи

В моей модели профиля есть изображение по умолчанию. Однако я ожидал, что все учетные записи, имеющие изображение по умолчанию, будут читать одно и то же изображение, но когда создается новая учетная запись, файл default.jpg повторно загружается в ведро s3.

Проблема вызвана функцией сжатия, если я удалю ее и код сохранения, проблема исчезнет.

как сделать так, чтобы он не сохранял файл default.jpg

def compress(image):
                im = Image.open(image)
                out_put_size = (300,300)
                im.thumbnail(out_put_size)
                # create a BytesIO object
                im_io = BytesIO() 
                # save image to BytesIO object
                im = im.resize([500,500])
                #resize image
                im = im.convert("RGB")
                im = im.save(im_io,'JPEG', quality=75) 
                # create a django-friendly Files object
                new_image = File(im_io, name=image.name)
                return new_image

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, max_length=30)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')

    def __str__(self):
        return f'{self.user.username} Profile'

    def save(self, *args, **kwargs):
        initial = self._state.adding
        #image compression start
        if self.image and initial:
            # call the compress function
            new_image = compress(self.image)
            # set self.image to new_image
            self.image = new_image
        #image compression end 
        super(Profile,self).save(*args, **kwargs)

Спасибо, что открыли новый вопрос. self.image всегда будет оцениваться как True, потому что вы установили изображение по умолчанию. По умолчанию оно никогда не будет нулевым. Следовательно, вызывается функция сжатия.

Необходимо проверить, отличается ли атрибут name аватара экземпляра от значения по умолчанию. Вы можете получить поле с помощью мета-опции get_field() и найти значение поля по умолчанию с помощью get_default().

Таким образом, полное значение для сравнения с именем изображения экземпляра будет Profile._meta.get_field('avatar').get_default().

Вы можете разбить это на несколько переменных для удобочитаемости или заменить Profile на self.__class__.

def save(self, *args, **kwargs):
    initial = self._state.adding
    avatar_field = Profile._meta.get_field('avatar')
    default_image_name = avatar_field.get_default()
    no_default_image = self.avatar.name != default_image_name
    #image compression start
    if no_default_image and initial:
        # call the compress function
        new_image = compress(self.image)
        # set self.image to new_image
        self.image = new_image
    #image compression end 
    super(Profile,self).save(*args, **kwargs)
Вернуться на верх