Django:复制FileFields

时间:2012-04-10 16:07:40

标签: django file path copy hardlink

我正在尝试使用硬链接复制文件,其中文件存储为Django FileField。我想使用硬链接来节省空间和复制时间(预计不会对原始文​​件或副本进行任何更改)。但是,当我尝试从下面的代码段调用new_file.save()时,我遇到了一些奇怪的错误。

AttributeError: 'file' object has no attribute '_committed'

我的想法是,在创建硬链接后,我可以打开链接文件并将其存储到Django新File实例的FileFile中。我错过了这里的一步还是什么?

models.py

class File(models.Model):
    stored_file = models.FileField()

others.py

import os 

original_file = File.objects.get(id=1)
original_file_path = original_file.file.path

new_file = File()
new_file_path = '/path/to/new/file'

os.makedirs(os.path.realpath(os.path.dirname(new_file_path)))
os.link(original_file_path, new_file_path)
new_file.stored_file = file(new_file_path)
new_file.save()

2 个答案:

答案 0 :(得分:8)

无需创建硬链接,只需复制文件夹:

new_file = File(stored_file=original_file.stored_file)
new_file.save()

更新

如果要将文件指定到FileField或ImageField,则只需

即可
new_file = File(stored_file=new_file_path)
# or
new_file = File()
new_file.stored_file = new_file_path
# or
from django.core.files.base import File
# from django.core.files.images import ImageFile # for ImageField
new_file.stored_file = File(new_file_path)

该字段接受basestring或File()实例中的路径,您的问题中的代码使用file(),因此不被接受。

答案 1 :(得分:2)

我想我解决了这个问题,但不确定为什么会这样。我将文件对象包装在“DjangoFile”类中(我导入为DjangoFile以避免与我之前定义的File模型发生冲突)。

from django.core.files.base import File as DjangoFile

...
new_file.stored_file = DjangoFile(file(new_file_path))
new_file.save()

这接近似乎保存文件OK。