重命名Django FileField中的文件

aem*_*mdy 7 django file django-models filefield

我知道这里有一个非常相似的线程,但我无法找到解决问题的方法.

我需要重命名一个保存在django models.FileField中的文件

我试过这个

os.rename(old_path, new_path)
mod.direct_file = File(open(new_path))
mod.save()
Run Code Online (Sandbox Code Playgroud)

还有这个

mod.direct_file.save(new_path, File(open(old_path)))
os.remove(old_path)
Run Code Online (Sandbox Code Playgroud)

还有很多方法,但似乎没有任何帮助.以各种方式创建新文件,但是,文件字段中的数据根本不会更改.

编辑:已解决

os.rename(old_path, new_path)
cursor = connection.cursor()
cursor.execute("UPDATE mods_mod SET direct_file = %s WHERE id = %s", [new_name, mod.id])
transaction.commit_unless_managed()
Run Code Online (Sandbox Code Playgroud)

Bri*_*eal 13

我不认为你需要使用原始SQL.我认为你需要使用os工具重命名文件,然后将模型的FileField名称设置为新名称.也许是这样的:

os.rename(model.direct_file.path, new_path)
model.direct_file.name = new_name
model.save()
Run Code Online (Sandbox Code Playgroud)


小智 5

 new_name = 'photos_preview/' + str(uuid.uuid1())
 os.rename(photo.image_preview.path, settings.MEDIA_ROOT + new_name)
 photo.image_preview.name = new_name
 photo.save()
Run Code Online (Sandbox Code Playgroud)


小智 3

当前的 Django 文档指出:

“当您访问模型上的 FileField 时,您将获得一个 FieldFile 实例作为访问底层文件的代理。” 请参阅文档以进一步阅读。

您应该使用 FieldFile.open() 打开文件,然后相应地操作文件的路径,而不是使用 Python File 对象打开文件。然后,保存模型对象,并且对路径的更改应该保留。