Обновление поля 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, которые я использую в ответе клиенту. Думаю это не единственный недостаток моего метода.

Подскажите, пожалуйста, как я могу выполнить поставленную задачу правильно?

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