Избегайте копирования при добавлении большого файла в FileField - PullRequest
1 голос
/ 19 августа 2009

Я имею дело с некоторыми довольно большими файлами, которые неудобно загружать через http, поэтому мои пользователи загружают файлы с использованием FTP, которые мой код затем должен переместить в FileField.upload_to (где они обычно заканчиваются при загрузке через HTTP). Моя проблема в том, что обычно предлагается метод использования django.core.files.File:

from django.core.files import File

# filename is a FileField
file_obj = MyModel(filename=File(open('VIDEO_TS.tar', 'rb')))

приводит к копированию данных, которых мне нужно избегать. Есть ли способ добавить уже существующий файл в FileField, убедившись, что вызывается upload_to?

Ответы [ 2 ]

3 голосов
/ 27 ноября 2009

немного поздно, но:

class _ExistingFile(UploadedFile):
    """ Utility class for importing existing files to FileField's. """

    def __init__(self, path, *args, **kwargs):
        self.path = path
        super(_ExistingFile, self).__init__(*args, **kwargs)

    def temporary_file_path(self):
        return self.path

    def close(self):
        pass

    def __len__(self):
        return 0

использование:

my_model.file_field.save(upload_to, _ExistingFile('VIDEO_TS.tar'))
0 голосов
/ 19 августа 2009

Я бы сказал, что самым простым способом было бы написать собственное поле или хранилище.

...