Django не обновляет поле ImageField
Почему Django update() не обновляет файл изображения в папке media, но обновляет все остальное в процессе обновления... Старое изображение находится в папке media, но нового изображения в папке нет... При создании (с помощью save()) все нормально... Любая помощь, спасибо заранее...
Вот класс модели:
class Company(models.Model):
name = models.CharField(max_length=100)
companyAddress = models.CharField(max_length=70)
companyPhoneNumber = models.CharField(max_length=30)
companyDescription = models.CharField(max_length=150)
companyProfileImage = models.ImageField(upload_to='images/', default = "images/defaultCompany.jpg", null = True)
Вот код, который я использую при обновлении:
newName = request.data['name']
newAddress = request.data['address']
newPhoneNumber = request.data['phoneNumber']
newDescription = request.data['description']
newCompanyProfileImage = request.data['image']
Company.objects.filter(id = companyId).update(name = newName, companyAddress = newAddress,
companyPhoneNumber = newPhoneNumber, companyDescription = newDescription, companyProfileImage = newCompanyProfileImage)
Метод .update
обходит метод модели save
.
Как отмечается в документах:
Файл сохраняется как часть сохранения модели в базе данных, поэтому фактическое имя файла, используемое на диске, не может быть определено до тех пор, пока модель не будет сохранена.
Поскольку вы используете .update
, вы обходите метод save
и поэтому изображение не сохраняется на диск.
Вы должны либо (1) использовать .save
для обновления изображения ИЛИ (2) обратиться к классу хранения полей, чтобы "вручную" поместить изображение в правильное место в соответствии с настроенным бэкендом хранения (сложно, потенциально ненадежно, поэтому должно быть сделано в транзакции).
Поскольку вы обновляете только один объект, использование метода .save
, вероятно, является наиболее простым решением:
obj = Company.objects.filter(id=companyId)
obj.name = newName
obj.companyAddress = newAddress
# ... etc
obj.companyProfileImage = newCompanyProfileImage
obj.save()