我正在尝试将一些模型的ImageFields从django-storages的存储后端迁移到使用S3BotoStorage。在此过程中,我更改了我的模型的ImageField声明,以包括storage=instance_of_s3botostorage参数,并且现在保存图像到ImageField属性的新模型实例将被存储在S3中,这正是我想要的。
我还尝试将现有的模型实例移动到在S3中存储它们的数据,因此编写了一个South DataMigration,如下所示:
我还尝试将现有的模型实例移动到在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()
实际上是属于FileField
的FieldFile
方法。
那么,如何在模型实例上移动/更改文件存储位置呢?