Джанго: Копия FileFields


Я пытаюсь скопировать файл, используя жесткую ссылку,где файл хранится как файловое поле Django. Я хотел бы использовать жесткую ссылку, чтобы сэкономить место и время копирования (никаких изменений в исходном файле или копии не ожидается). Однако я получаю некоторые странные ошибки, когда пытаюсь вызвать new_file.save () из фрагмента ниже.

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

Я думаю, что после создания жесткой ссылки я могу просто открыть связанный файл и сохранить его в файл экземпляра Django new File. Неужели я пропустил шаг? здесь, что ли?

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

2 ответа:

Нет необходимости создавать hardlink, просто дублируйте держатель файла:

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

обновить

Если вы хотите указать file to 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 () и, следовательно, не принимается.

Я думаю, что решил эту проблему, но не уверен, почему это работает. Я завернул объект file в класс "DjangoFile" (я импортировал как DjangoFile, чтобы избежать столкновения с моей ранее определенной файловой моделью).

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

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

Этот подход, казалось, сохранял файл в порядке.