如何使用South的DataMigration更改Django模型中的ImageField实例的存储后端?

4
我正在尝试将一些模型的ImageFields从django-storages的存储后端迁移到使用S3BotoStorage。在此过程中,我更改了我的模型的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()实际上是属于FileFieldFieldFile方法。

那么,如何在模型实例上移动/更改文件存储位置呢?

2个回答

4

所以,事实证明用于文件存储的特定存储方式并未存储在数据库中。'迁移'只是改变模型定义的问题,然后在不使用存储子系统API的情况下,简单地将文件上传到新的存储位置。


1
请放心接受这个答案。它会帮助那些在你之后来的人。 - Manoj Govindan
请问您能否详细说明一下您的答案?我遇到了完全相同的问题。 - chhantyal
@neokya 那么,更改模型定义以引用您希望使用的新存储后端,然后(使用其他工具)将数据从原始文件存储复制到新文件存储(当然要保留路径)。 - markhellewell
谢谢。我按照你说的做了。我写了一小段脚本在这里和那里复制文件,看起来很好 :) - chhantyal

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接