11

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

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

我试过这个

os.rename(old_path, new_path)
mod.direct_file = File(open(new_path))
mod.save()

和这个

mod.direct_file.save(new_path, File(open(old_path)))
os.remove(old_path)

还有许多其他方法,但似乎没有任何帮助。以各种方式创建了一个新文件,但是,filefield 中的数据根本没有改变。

编辑:已解决

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()
4

6 回答 6

14

I don't think you need to use raw SQL for this. I think you need to rename the file using the os facility, then set the model's FileField name to the new name. Maybe something like:

os.rename(model.direct_file.path, new_path)
model.direct_file.name = new_name
model.save()
于 2013-05-13T01:57:16.620 回答
2

当前的 Django 文档指出:

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

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

于 2012-09-10T20:41:32.540 回答
2
 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()
于 2015-01-27T15:19:20.013 回答
1

当我将 blob 保存到没有文件扩展名的 django 中时遇到了这个问题,我想纠正这个问题。最好在遍历过滤的查询集时使用。

您无法更改 instance.picture.path,并且尝试访问 instance.picture.file.* 会出错,因为访问它会尝试打开旧文件。设置 instance.picture.name 仍然不会让您访问 instance.picture.file.*,即使在保存之后也是如此。

您可以简单地将 ImageField 对象本身设置为该位置,一切都将起作用:

(用 django 1.10 测试)

import imghdr
import os

from django.db import models

class MyModel(models.Model):
    picture = models.ImageField()

instance = MyModel.objects.first()
if os.path.exists(instance.picture.path):
    extension = imghdr.what(instance.picture.path)
    os.rename(instance.picture.path, instance.picture.path + '.' + extension)
    instance.picture = instance.picture.name + '.' + extension
    instance.save()
于 2017-02-15T10:17:22.117 回答
1

您可以使用以下内容:

假设 'obj' 是您要重命名的 django 对象。然后这样做:

obj.file_field_name.name = new_name

obj.save()

于 2020-01-10T04:39:48.333 回答
0

根据 django 文档,在 FileField 中更改二进制文件的文件名似乎非常不灵活。它包含来自媒体根目录的路径。这指出了一个反映路径的名称 attr,而不仅仅是文件名本身。文档:这是 django 模型可以找到文件的方式

于 2021-12-21T07:37:45.573 回答