ImageField не обновляется при использовании метода update() в Django Serializer
Я хочу дать администратору возможность обновлять изображение, связанное с записью продукта. У меня есть класс редактирования, который позволяет администратору обновлять различные элементы записи, все из которых обновляются правильно, за исключением полей изображения. Проблема в том, что загрузка изображения работает при создании, но не при обновлении.
Модель:
image1 = models.ImageField(db_column='product_image1', null=True, blank=True, upload_to='media/images/')
Serializer :
class products_update(serializers.ModelSerializer):
class Meta:
model = Product
fields =['category','product_name','description','unit_price','dis_price','image1','image2','image3']
Виды :
POST
Product.objects.create(product_name=productname,
description=description, quantity=quantity, unit_price=unitprice,
dis_price=discountprice,user=usertable, category=categoryid, image1=image1)
Изображение успешно загружено в папку media и путь к нему сохранен в базе данных.
PUT
Product.objects.filter(id=pid, user=userdata).update(category = category, product_name=productname, description=description,unit_price=unitprice, dis_price=discountprice, image1=image1
Когда я использую метод Update, путь изображения сохраняется в DB, но изображение не сохраняется в папке Media.
у кого-нибудь есть идея, как решить эту проблему
<queryset>.update(...)
только добавляет вид аннотаций к queryset и влияет только на генерацию SQL запросов и не вызывает метод model.save
. Однако только model.save
оперирует с экземплярами модели и вызывает метод fields save
, который достигает файлового хранилища . Кверисет (<model>.objects.filter().update()
) не может ничего делать с файловыми хранилищами.
Поэтому вместо написания запроса обновления следует инстанцировать экземпляр модели и сохранить его. В документации DRF есть примеры реализации сериализаторов, которые сохраняют экземпляры (как экземпляры модели, а не прямое обновление БД)
Вы используете ModelSerializer
, который по умолчанию вызывает instance.save
в update
реализации метода , поэтому непонятно, как вы пришли к своей реализации. Просто следуйте документации и позвольте model.save произойти.