Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:将以前上载的所有媒体文件移动到新位置并重命名_Python_Django - Fatal编程技术网

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

Python Django:将以前上载的所有媒体文件移动到新位置并重命名,python,django,Python,Django,所以,我正在使用Django(1.10),我已经上传了几百个(媒体)文件。我想移动并重命名所有文件,因为我想稍微更改文件夹结构 在我的models.py中,我有一个非常有效的save()方法,可以将文件保存在正确的位置,但它只适用于新文件。我想移动所有已经存在的文件 我希望通过对所有对象调用save方法,它会自动移动和重命名文件,但这并没有起到任何作用(就像我预期的那样) 有没有一个简单的方法可以做到这一点?我觉得我忽略了一个非常直接的解决方案…好的,您必须在这里编写一些脚本。您可以在这里使用d

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

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

我希望通过对所有对象调用save方法,它会自动移动和重命名文件,但这并没有起到任何作用(就像我预期的那样)


有没有一个简单的方法可以做到这一点?我觉得我忽略了一个非常直接的解决方案…

好的,您必须在这里编写一些脚本。您可以在这里使用django扩展。 您可以在项目中设置相同的设置 假设您的型号
文件

编写一个脚本让我们
migrate\u media\u 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

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

只需将
mv
cp
文件放入新目录,并在终端中重命名即可。在django中,只是在之后替换路径?嗯,也许这还不完全清楚,但是应该根据存储在数据库/models.py中的其他信息删除/重命名文件。所以,我认为仅仅“手动”移动它们是不可能的。那么请提供更多信息。现在数据库中的文件名/目录结构是什么?它们应该是什么样子?在my models.py中,是一个名为File的模型。一个文件(显然)有一个文件字段和一系列其他字段,用于提供有关该文件的信息,例如作者、对象名称等。旧结构是:/[theme name]/[number]/[number]-[name]].txt新结构应该是:/[theme name]/[number]-[name]/[number]-[name].txt,除此之外,已上载文件的主题名称也已更改。谢谢!非常感谢您的帮助:)我试着让它工作起来,但我一直在os.path.join行中收到一个Django可疑文件操作警告,用于旧的_path_文件。它表示连接的路径在项目文件夹(控制台中的打印行位于该文件夹)之外。我不知道这个错误是从哪里来的(媒体目录在打印时看起来很好)。正如我所说的,我还没有测试。file.images提供图像对象。编辑答案以使用file.image.name获取路径。我们可以来聊天,或者希望你能更新工作答案。好的,我现在已经成功了。可疑的文件错误有点愚蠢。显然,它已经移动了早期运行中的所有文件,但我没有注意到这一点。由于一个小错误,所有文件都被移动到驱动器根文件夹中的文件夹中。我删除了它们,并用一个备份替换了(现在是“损坏的”)数据库。再次运行程序,并将它们再次移动到根目录。我终于找到了问题的根源:dir_name和new_file_name不应该以a/开头,否则os.join显然会失败。因此,简而言之,我改变了一些事情:删除了starting/in dir_name和new_file_name,使用settings.MEDIA_ROOT,而不是手动创建自定义MEDIA_dir,并略微更改了命名方案(但这显然是可选的)。谢谢!很高兴能提供帮助。您应该用您所做的修复更新答案。