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

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

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

def forwards(self, orm):
 "upload ImageField file to S3 if it 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

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

2 ответа

Итак, получается, что конкретное хранилище, используемое для файлов, не хранится в базе данных. "миграция" - это просто вопрос изменения определения модели, за исключением использования API подсистемы хранения, просто загружайте файлы в новые места хранения.


Я бы посмотрел на систему, более похожую на эту проблему. http://github.com/seanbrant/django-queued-storage

licensed under cc by-sa 3.0 with attribution.