5

ハードリンクを使用してファイルをコピーしようとしています。ファイルはDjangoFileFieldとして保存されています。スペースとコピー時間を節約するためにハードリンクを使用したい(元のファイルまたはコピーに変更が加えられることはない)。ただし、以下のスニペットからnew_file.save()を呼び出そうとすると、奇妙なエラーが発生します。

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

私の考えでは、ハードリンクを作成した後、リンクされたファイルを開いて、Djangoの新しいファイルインスタンスの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()
4

2 に答える 2

10

ハードリンクを作成する必要はありません。ファイルホルダーを複製するだけです。

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()を使用しているため、受け入れられません。

于 2012-04-10T16:58:26.783 に答える
2

私はこの問題を解決したと思いますが、なぜそれが機能するのかわかりません。ファイルオブジェクトを「DjangoFile」クラスでラップしました(以前に定義したファイルモデルとの衝突を避けるために、DjangoFileとしてインポートしました)。

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

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

これは、ファイルを保存するように見えました。

于 2012-04-10T23:43:37.953 に答える