Обновление поля models.ImageField Django-проекта на данные существующего изображения проекта
У меня есть приложение на базе Django и DjangoRestFramework, позволяющее клиентам сервиса загружать изображения на сервер.
Проблема заключается в реализации следующей задачи:
При запросе клиента на images/<id_image>/resize/
c параметрами (int: height, int: width)
cоздать копию изображения <id_image>
измененного размера (использовать Pillow) с созданием новой записи в БД.
Моя попытка реализовать это выглядит так:
models.py
class Images(models.Model):
name = models.CharField(max_length=200, verbose_name='Название')
picture = models.ImageField(
upload_to='images/', verbose_name='Изображение'
)
url = models.URLField(blank=True, null=True, verbose_name='URL-адрес')
parent_picture = models.ForeignKey(
'self',
blank=True,
null=True,
related_name='children_pictures',
on_delete=models.SET_NULL,
verbose_name='Родительское изображение'
)
views.py
from copy import copy
from PIL import Image
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from .models import Images
from .serializers import ImagesSerializer, ResizeSerializer
def resize(image_path, name, width, height):
with Image.open(image_path) as tatras:
new = tatras.resize((width, height), Image.ANTIALIAS)
new_name = name.split('.')[-2] + '_copy.png'
path = image_path.split('.')[-2] + '_copy.png'
new.save(path)
return new_name
)
class ImagesViewSet(viewsets.ModelViewSet):
queryset = Images.objects.all()
serializer_class = ImagesSerializer
http_methods = ['get', 'post', 'delete']
@action(methods=['post'], detail=True)
def resize(self, request, pk=None):
resize_serializer = ResizeSerializer(data=request.data)
resize_serializer.is_valid(raise_exception=True)
parent_image = self.get_object()
image = copy(parent_image)
image.id = None
image.parent_picture = parent_image
name = resize(
image.picture.path, image.picture.name, **resize_serializer.validated_data
)
image.picture = name
image.save()
serializer = self.get_serializer(image)
return Response(serializer.data)
Проблема в том, что при моем методе добавления изображения в БД (image.picture = path_to_new_image_in_media_dir
) не обновляются значения атрибутов image.picture.width
и image.picture.height
, которые я использую в ответе клиенту. Думаю это не единственный недостаток моего метода.
Подскажите, пожалуйста, как я могу выполнить поставленную задачу правильно?