«Загрузить» файл из оболочки django - PullRequest
14 голосов
/ 05 августа 2009

Мне нужно импортировать некоторые данные из файла Excel и папки с изображениями, каждая строка в Excel описывает каждую запись и содержит список имен файлов в папке (фотографии, относящиеся к записи).

Я создал скрипт, который создает каждую запись в базе данных и сохраняет ее через оболочку django, но я не знаю, как создать экземпляр InMemoryUploadedFile для сохранения его вместе с моделью.

В django 1.0 у меня был небольшой класс, который позволял мне делать то, что мне нужно, но с изменениями в django 1.1 он больше не работает.

class ImportFile(file):
    def __init__(self, *args, **kwargs):
        super(ImportFile, self).__init__(*args, **kwargs)
        self._file = self
        self.size = os.path.getsize(self.name)

    def __len__(self):
        return self.size

    def chunks(self, chunk_size=None):
        self._file.seek(0)
        yield self.read()

Я использовал этот класс с этим фрагментом кода для загрузки изображений и сохранения их с экземпляром модели.

for photo in photos:
    f = ImportFile(os.path.join(IMPORT_DIR, 'fotos', photo), 'r')
    p = Photo(name=f.name, image=f, parent=supply.supply_ptr)
    name = str(uuid1()) + os.path.splitext(f.name)[1]
    p.image.save(name, f)
    p.save()

Вопрос в том, как мне создать InMemoryUploadedFile или TemporaryUploadedFile из файла в python? Или любую другую вещь, которая может работать в этом контексте.

Ответы [ 2 ]

22 голосов
/ 05 августа 2009

Наконец я нашел ответ.

from django.core.files import File

f = File(open(os.path.join(IMPORT_DIR, 'fotos', photo), 'r'))
p = Photo(name=f.name, image=f, parent=supply.supply_ptr)
name = str(uuid1()) + os.path.splitext(f.name)[1]
p.image.save(name, f)
p.save()
4 голосов
/ 11 июля 2014

При использовании Python 3 необходима одна настройка - измените 'r' на 'rb':

f = File(open(os.path.join(IMPORT_DIR, 'fotos', photo), 'rb'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...