Метод Django save() не сохраняет в функции upload_to

В моем коде есть проблема. У меня есть модель пользователя и в ней есть поле profile_image с ImageField. Я определил функцию profileImageRoot() и приравнял ее к upload_to аргументу ImageField. У меня есть profile_image_count IntegerField и оно увеличивается на 1 единицу при загрузке изображения в profileImageRoot(). Я пытаюсь сохранить значение profile_image_count в базе данных, но метод save() не сохраняет. Мой исходный код:
Модель пользователя:

class User(AbstractBaseUser):
    username                = models.CharField(max_length=20, unique=True, verbose_name="Username")
    email                   = models.EmailField(unique=True, verbose_name="Email", help_text="Email you actively use")
    first_name              = models.CharField(max_length=20)
    last_name               = models.CharField(max_length=20)
    date_of_birth           = models.DateField(blank=False)
    date_created            = models.DateTimeField(auto_now_add=True)
    last_login              = models.DateTimeField(auto_now=True)
    profile_image           = models.ImageField(upload_to=profileImageRoot)
    profile_image_count     = models.IntegerField(default=0)
    spent_money             = models.FloatField(default=0)

    is_active               = models.BooleanField(default=True)
    is_admin                = models.BooleanField(default=False)
    is_staff                = models.BooleanField(default=False)
    is_superuser            = models.BooleanField(default=False)
    is_verified             = models.BooleanField(default=False)

    objects = UserManager()


    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ('username', 'first_name', 'last_name', 'date_of_birth')

    def has_perm(self, perm, obj=None):
        return self.is_admin

    def has_module_perms(self, app_label):
        return True

    def get_full_name(self):
        return f"{self.first_name} {self.last_name}"
    
    def is_birthday(self):
        if timesince(self.date_of_birth, datetime.today()) == datetime(day=0, month=0):
            return True
        else:
            return False


    def verify(self):
        self.is_verified = True

    def __str__(self):
        return self.get_full_name()

profileImageRoot():

def profileImageRoot(instance, filename):
    user = User.objects.get(pk=instance.pk)
    ext = filename.split(".")[-1]
    user.profile_image_count += 1
    print(user.profile_image_count)
    user.save()
    return f"{user.username}/profile_image/{user.profile_image_count}.{ext}"

Это вероятно потому, что ваш исходный instance содержит старое значение для profile_image_count. Поскольку процесс сохранения сначала должен вызвать profileImageRoot(), а затем записать данные из instance в базу данных, ваше увеличенное значение для profile_image_count переопределяется старым значением.

Попробуйте также увеличить instance.profile_image_count в profileImageRoot().

Однако в целом это кажется плохим решением. Если вам нужен некоторый порядок в именах файлов для изображений профиля, подумайте об использовании временных меток или чего-то подобного. Кроме того, нет никакой гарантии, что profileImageRoot() будет вызываться только один раз на каждый вызов save(), или что он не будет вызываться, пока не будет загружено новое изображение.

+1 У меня проблема в коде. У меня есть модель пользователя и в ней есть поле profile_image с ImageField. Я определил функцию profileImageRoot() и приравнял ее к аргументу upload_to поля ImageField. У меня есть поле profile_image_count IntegerField и оно увеличивается на 1 единицу при загрузке изображения в profileImageRoot(). Я пытаюсь сохранить значение profile_image_count в базе данных, но метод save() не сохраняет. Мой исходный код: Модель пользователя:

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