Django:将之前上传的所有媒体文件移动到新位置并重命名

时间:2017-02-12 08:40:22

标签: python django

所以,我正在使用Django(1.10)并且我有几百个上传(媒体)文件。我想移动并重命名所有文件,因为我想略微更改文件夹结构。

在我的models.py中,我确实有一个完美的save()方法,可以将文件保存在正确的位置,但它只适用于新文件。我想移动所有已存在的文件。

我希望通过在所有对象上调用save方法,它会自动移动并重命名文件,但是没有做任何事情(就像我预期的那样)。

有一种简单的方法吗?我觉得我忽略了一个非常简单的解决方案......

1 个答案:

答案 0 :(得分:1)

好的,你必须在这里做一些脚本。你可以在这里使用django-extensions。 https://github.com/django-extensions/django-extensions 您可以在项目中设置相同的内容 假设您的模型File

写一个脚本,让migrate_media_files.py

import os
from django.conf import settings
from shutil import copyfile


def run():
    base_dir = settings.BASE_DIR
    media_dir = os.path.join(base_dir,'project_name/media')

    for file in Files.objects.all():
        old_file_path = os.path.join(media_dir, file.image.name)
        dir_name = '/{}-{}/{}-{}/'.format(file.theme,file.name,file.id, file.name)
        if not os.path.exists(os.path.join(media_dir, dir_name)):
            os.makedirs(os.path.join(media_dir, dir_name))
        new_file_name = '/{}-{}/{}-{}/{}-{}.txt'.format(file.theme,file.name,file.id, file.name, file.id, file.name)
        new_file_path = os.path.join(media_dir, new_file_name)
        copyfile(old_file_path, new_file_path)
        file.image.url = new_file_name
        file.save()

运行:

python manage.py runscript migrate_file

此脚本主要播放文件和对象。您可能需要更改和测试。祝一切顺利。