Domanda

Devo importare alcuni dati da un file Excel e da una cartella con immagini, ogni riga di Excel descrive ogni voce e ho un elenco di nomi di file nella cartella (foto relative alla voce).

Ho creato uno script che crea ogni voce nel database e la salva tramite la shell di django, ma non ho idea di come creare un'istanza di InMemoryUploadedFile per salvarla con il modello.

In django 1.0 ho avuto questa piccola classe che mi ha permesso di fare ciò di cui ho bisogno, ma con le modifiche in django 1.1 non funziona più.

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

Stavo usando questa classe con questo pezzo di codice per caricare immagini e salvarle con l'istanza del modello.

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

La domanda è: come posso creare un file InMemoryUploadedFile o TemporaryUploadedFile da un file in Python? o qualsiasi altra cosa che possa funzionare in questo contesto.

È stato utile?

Soluzione

Finalmente ho trovato la risposta.

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

Altri suggerimenti

Se si utilizza Python 3 è necessaria una regolazione: cambiare 'r' in 'rb':

f = File(open(os.path.join(IMPORT_DIR, 'fotos', photo), 'rb'))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top