Django - Изображение загружается после каждого сохранения()

I have a custom upload path for any users avatar. I call a function to set the upload path to "avatar/" + str(self.username) + "/" + filename. My problem is everytime the user change e.g. email and save changes, the avatar gets saved again with the same upload path. models.py

def _upload_path(instance, filename):
    return instance.get_upload_path(filename)


def reduce_image_size(avatar):
    img = Image.open(avatar).convert('RGB')
    thumb_io = BytesIO()
    img.save(thumb_io, 'jpeg', quality=50)
    new_image = File(thumb_io, name=avatar.name)
    return new_image


class User(AbstractUser):
    avatar = models.ImageField(upload_to=_upload_path, blank=True, null=True)

    def get_upload_path(self, filename):
        return "avatar/" + str(self.username) + "/" + filename

    def save(self, *args, **kwargs):
        new_image = reduce_image_size(self.avatar)
        self.avatar = new_image

When first upload image the url is /media/avatar/username/the_uploaded_image.jpg and after updating any value it changes to /media/avatar/username/avatar/username/the_uploaded_image.jpg

Я пытался проверить, существует ли уже путь, но это не сработало.

    if self.avatar and not os.path.exists(settings.MEDIA_URL + self.get_upload_path(self.avatar.name)):
        new_image = reduce_image_size(self.avatar)
        self.avatar = new_image

Я что-то упустил?

Обратите внимание, что функция save срабатывает при каждом сохранении - как для нового, так и для старого пользователя.

Таким образом, reduce_image_size срабатывает при каждом сохранении (независимо от того, новое оно или старое) - таким образом, изображение пересохраняется каждый раз.

Чтобы это происходило только для новых пользователей - просто добавьте следующее условие, чтобы проверить, работаете ли вы с существующим пользователем:

class User(AbstractUser):
    def save(self, *args, **kwargs):
        if not self.pk:  # new user
            new_image = reduce_image_size(self.avatar)
            self.avatar = new_image

        super().save(*args, **kwargs) # don't see this line in your code but I guess it's there...

Change

if self.avatar and not os.path.exists(settings.MEDIA_URL + self.get_upload_path(self.avatar.name)):

to

if not self.pk:

он проверяет, существует ли первичный ключ, и должен решить вашу проблему

Вернуться на верх