更改upload_to时,Django重新上传图像

时间:2014-09-07 12:46:38

标签: django django-models

我更改了模型图片字段的upload_to属性。如何将所有图像重新上传到新路径?

2 个答案:

答案 0 :(得分:1)

所以,我认为重新上传'这是错误的思考方式 - 重新上传图像仍然会让旧图像四处闲置,这取决于你有多少图像,这可能是一个巨大的空间浪费。实现此目的的一种方法是通过以下两个步骤:

1)通过适当的操作系统方法,在您的服务器上手动将文件移动到新的upload_to位置。这可能都是在linux上使用一个mv命令完成的,如果这是你正在托管的内容。

2)如果你只是更改了upload_to属性,并且没有更改MEDIA_ROOT设置或其他任何内容,那么您需要更改的是Imagefield的{{1}属性。正确的ImageField名称通常是您的name字符串和图像文件名的连接(然后将其附加到MEDIA_URL以形成图像url或MEDIA_ROOT以形成实际的上传路径)。因此,您可以通过键入以下内容来更新Django shell中的模型:

upload_to

您可以通过调用import os from my_app import MyModel newpath = 'your/new/upload_to/' for obj in MyModel.objects.all(): image_name = os.path.split(obj.my_img_field.name)[1] obj.my_img_field.name = newpath + image_name obj.save() 检查一切是否正常工作,并查看它是否应该指向该位置。

答案 1 :(得分:0)

当我需要在许多型号上执行此操作,而又不想在操作系统级别上执行此操作时,这是我的一些摘要。
为了与strftime一起使用,必须对此进行修改。

models = (YourModel1, YourModel2)

for Model in models:
    for field in Model._meta.get_fields():
        if not hasattr(field, 'upload_to'): 
            continue
        for instance in Model.objects.all():
            f = getattr(instance, field.name)
            if not f:
                continue
            if field.upload_to not in str(f):
                filename = os.path.basename(f.name)
                new_path = os.path.join(field.upload_to, filename)
                os.makedirs(
                    os.path.join(
                        settings.MEDIA_ROOT, 
                        field.upload_to
                    ), 
                    exist_ok=True
                )
                try:
                    shutil.move(
                        os.path.join(settings.MEDIA_ROOT, f.name),
                        os.path.join(settings.MEDIA_ROOT, new_path)
                    )
                    setattr(instance, field.name, new_path)
                except FileNotFoundError as e:
                    logger.error("Not found {}".format(field.name))
                    logger.error(str(e))
                else:
                    instance.save()