Джанго: Копия 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 ответа:
Нет необходимости создавать 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()
Этот подход, казалось, сохранял файл в порядке.