Объект ‘Image’ модели Django не имеет атрибута ‘_committed’

#python #django

#питон #джанго

Вопрос:

Я сталкиваюсь с этой ошибкой в Django

 'Image' object has no attribute '_committed'
 

Это моя модель:

 class ProcessedPicture(models.Model):
    processed_picture = models.ImageField(upload_to='processed_pictures')
 

Затем я обрабатываю картинку и присваиваю ей вот так:

 def do_something():
   ...............
   rgb = Image.fromarray(image)
   return rgb

 

Затем я просто пытаюсь сохранить результат в хранилище S3. Ни бланков, ни запросов, ничего:

 score = do_something()
processed = ProcessedPicture()
processed.processed_picture = score
processed.save()
 

И это приводит к сбою с вышеуказанной ошибкой. Есть какие-нибудь идеи, ребята?

Комментарии:

1. Я думаю, что проблема здесь в том, что вы передаете объект img и пытаетесь сохранить в БД, на самом деле в БД хранится только имя img, а не сам img, попробуйте передать файл, созданный из obj

2. Вы не можете назначить score ImageField или, по крайней мере, напрямую. Вам нужно обернуть его в FieldFile .

Ответ №1:

Затем я просто пытаюсь сохранить результат в хранилище S3.

Интерфейс a FileField / работает не так ImageField . Вы не можете просто назначить Image поле. Действительно, когда вы сохраняете изображение, у вас есть не только «данные изображения», но и, например, имя файла. Вы можете сохранить его в потоке памяти, который затем переносится в NamedTemporaryFile :

 from django.core.files import File
from django.core.files.temp import NamedTemporaryFile

with NamedTemporaryFile(delete=True) as img_tmp:
    score = do_something()
    
    score.save(img_tmp, format='JPEG')
    img_tmp.flush()
    
    processed = ProcessedPicture()
    processed.processed_picture.save('name_of_the_file.jpg', File(img_tmp))
    processed.save() 

Комментарии:

1. Спасибо, приятель. Получил это, и это сработало. Приветствия