Как я могу использовать South DataMigration для изменения хранилища экземпляра ImageField модели Django?

Я пытаюсь перенести некоторые модели ImageFields на использование серверной части хранилища S3BotoStorage из django-storages. В рамках этого процесса я изменил объявление ImageField моей модели, включив в него аргумент storage=instance_of_s3botostorage, и новые экземпляры моей модели, которые сохраняют изображение в атрибуте ImageField, теперь сохраняются в S3 — как и предполагалось.

Я также попытался переместить существующие экземпляры модели для хранения их данных в S3, поэтому написал South DataMigration следующим образом:

def forwards(self, orm):
    "upload ImageField file to S3 if it's not already in there"
    for mymodel in orm.MyModel.objects.all():
        if mymodel.logo_image and not isinstance(mymodel.logo_image.storage, S3BotoStorage):
            print "uploading %s to S3" % mymodel.logo_image
            file_contents = ContentFile(mymodel.logo_image.read())
            mymodel.logo_image.save(mymodel.logo_image.name, file_contents)
            mymodel.save()

но это явно не имеет ожидаемого эффекта, потому что файл изображения просто сохраняется с использованием старого бэкэнда storage, что имеет смысл, учитывая, что save() на самом деле является методом FieldFile, принадлежащим FileField

Итак, как переместить/изменить хранилище файлов на экземпляре модели?


person markhellewell    schedule 23.08.2010    source источник


Ответы (2)


Итак, оказывается, конкретное хранилище, используемое для файлов, не хранится в базе данных. «Миграция» — это просто изменение определения модели, а затем, помимо использования API подсистемы хранения, просто загрузка файлов в новые места хранения.

person markhellewell    schedule 23.08.2010
comment
Давай, прими этот ответ. Это поможет тем, кто придет после вас. - person Manoj Govindan; 23.08.2010
comment
Не могли бы вы немного расширить свой ответ? Я столкнулся с точно такой же проблемой. - person chhantyal; 28.09.2013
comment
@neokya, поэтому измените определение модели, чтобы оно ссылалось на новое хранилище, которое вы хотите использовать, а затем (используя какой-либо другой инструмент) скопируйте данные из исходного хранилища файлов в новое хранилище файлов (конечно, сохраняя пути). - person markhellewell; 04.10.2013
comment
Спасибо. Я сделал именно то, что вы говорите. Я написал небольшой скрипт для копирования файлов здесь и там, который выглядит нормально :) - person chhantyal; 04.10.2013

Я бы посмотрел на систему больше, как это для вашей проблемы. http://github.com/seanbrant/django-queued-storage

person kkubasik    schedule 23.08.2010