Метод 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() не сохраняет. Мой исходный код: Модель пользователя: