Pergunta

Preciso importar alguns dados de um arquivo do Excel e uma pasta com imagens, cada linha do Excel descreve cada entrada e ter uma lista de nomes de arquivos na pasta (fotos relacionadas à entrada).

Fiz um script que cria todas as entradas no banco de dados e o salva através do shell do Django, mas não tenho idéia de como instanciar um arquivo inmemoryuploaded para salvá -lo com o modelo.

No Django 1.0, tive essa classe pequena que me permitiu fazer o que preciso, mas com as alterações no Django 1.1, não está mais funcionando.

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

Eu estava usando esta classe com este pedaço de código para carregar imagens e salvá -las com a instância do modelo.

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

A questão é: como faço para criar um arquivo inmemoryuploaded ou temporário a partir de um arquivo em Python?, Ou alguma outra coisa que poderia funcionar nesse contexto.

Foi útil?

Solução

Finalmente encontrei a resposta.

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

Outras dicas

Se estiver usando Python 3 Um ajuste é necessário - altere 'r' para 'rb':

f = File(open(os.path.join(IMPORT_DIR, 'fotos', photo), 'rb'))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top