重命名Django FileField中的文件

时间:2012-09-10 20:27:15

标签: django file django-models filefield

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

我需要重命名一个保存在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)

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

编辑:已解决

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 个答案:

答案 0 :(得分:11)

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

os.rename(model.direct_file.path, new_path)
model.direct_file.name = new_name
model.save()

答案 1 :(得分:1)

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

答案 2 :(得分: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()

答案 3 :(得分:0)

您可以使用以下内容:

假设“ obj”是要重命名的django对象。然后执行以下操作:

obj.file_field_name.name =新名称

obj.save()