ファイルがDjango FileFieldとして保存されているハードリンクを使用してファイルをコピーしようとしています。私はスペースとコピー時間を節約するためにハードリンクを使用したいと思います(元のファイルまたはコピーに変更は行われません)。しかし、私は以下のスニペットからnew_file.save()を呼び出そうとすると、幾分奇妙なエラーが出ます。Django:Copy FileFields
AttributeError: 'file' object has no attribute '_committed'
私の思考は、ハードリンクを作成した後、私はリンクされたファイルを開くことができますし、Djangoの新しいFileのインスタンスのFileFileにそれを保存することです。ここに何か一歩も欠けていますか?
models.py
class File(models.Model):
stored_file = models.FileField()
elsewhere.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()
ご回答ありがとうございます。私がハードリンクを選んだ理由は、新しいFile()インスタンスと別のファイルパスを保存したいからです。私は上記のスニペットで要件が明らかではないと思う - 私はできるだけ簡素化しようとした - しかし、File()モデルのインスタンスに関連付けられているuuidに基づいてファイル名を作成しています。 File()モデルのインスタンスをコピーすると、新しいFile()インスタンスのuuidと一致するように、下敷きのstored_fileパスが必要になります。だからこそ、私はハードリンクに向かって重いものでした。 –
@JoeJ私は、あなたの答えが正しいことを確認します。私の答えも更新しました – okm