Объект Django 'Image' не имеет атрибута '_committed' [duplicate]

Я сделал бы выбор на основе следующих критериев

  • ссылочного типа vs семантики типа значения. Если 2 объекта равны только, если они являются одним и тем же объектом, это указывает на тип ссылочного типа semantics => class. Если значение его членов определяет равенство (например, 2 DateTimes равны, если оба представляют один и тот же момент времени, даже если они представляют собой два разных объекта), тип значения semantics => struct
  • Объем памяти объекта. Если объект огромен и часто распределен, то его структура будет потреблять стек намного быстрее, поэтому я бы предпочел использовать его как класс. Напротив, я предпочел бы избежать штрафа GC за небольшие типы значений; следовательно, сделать их структурой.
  • можете ли вы сделать объект неизменным? Я нахожу structs great для «объектов ценности» - из книги DDD.
  • Вы столкнулись бы с некоторым штрафом за бокс-разблокирование, основанным на использовании этого объекта? Если да, перейдите к классу.
0
задан Zorgan 15 March 2018 в 12:18
поделиться

1 ответ

Чтобы изменить содержимое поля файла, вы должны передать экземпляр объекта File django в FileField.save() . Он немного отличается от других типов полей модели.

FieldFile.save (name, content, save = True)

Этот метод принимает имя файла и содержимое файла и передает их классу хранения для поля, а затем ассоциирует сохраненный файл с полем модели. Если вы хотите вручную связать данные файла с экземплярами FileField в своей модели, метод save () используется для сохранения данных файла.

from PIL import Image
from django.core.files.base import ContentFile

if instance.image:
    im = Image.open(instance.image)
    im.thumbnail((220, 130), Image.ANTIALIAS)
    thumb_io = BytesIO()
    im.save(thumb_io, im.format, quality=60)
    instance.image.save(im.filename, ContentFile(thumb_io.get_value()), save=False)
instance.save()

Но если вы не используете удаленный файловой системы, вы можете просто перезаписать сам файл. Файл был создан при вызове form.save(). Поскольку вы используете одно и то же имя файла и местоположение, вам действительно не нужно прикасаться к модели или сообщать django, что вы возитесь с самим файлом.

if instance.image:
    im = Image.open(instance.image)
    im.thumbnail((220, 130), Image.ANTIALIAS)
    im.save(im.filename, quality=60)
1
ответ дан Håken Lid 16 August 2018 в 02:36
поделиться
  • 1
    Оба метода не работают, я добавил свои попытки в редактирование, если бы вы могли посмотреть. Я использую удаленное хранилище S3, но сейчас я просто тестирую свою локальную среду разработки. Но почему имеет значение, является ли это удаленным бэкэнд или нет - настройка по-прежнему остается прежней (static_root, media_root и т. Д., Только в разных местах? – Zorgan 15 March 2018 в 12:22
  • 2
    Если вы используете S3, вы должны использовать метод instance.image.save. PIL.Image.save будет сохраняться только в локальной файловой системе. Он не знает о резервных копиях django. – Håken Lid 15 March 2018 в 13:53
  • 3
    Верно, я тебя понимаю. Но проблема с первым методом thumb.save(thumb_io, im.format, quality=60) возвращает AttributeError: 'NoneType' object has no attribute 'save' - когда я печатаю thumb, он печатает None - любую идею? – Zorgan 15 March 2018 в 22:56
  • 4
    Ах. Я допустил ошибку. Я думал, что Image.thumbnail () должен возвращать новый объект Image, но вместо этого он изменяет объект Image на месте и возвращает None. Теперь я исправил код в своем ответе. – Håken Lid 15 March 2018 в 23:17
Другие вопросы по тегам:

Похожие вопросы: