我知道这里有一个非常相似的主题,但我无法找到解决问题的方法。
我需要重命名一个保存在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()
答案 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()