Pregunta

Necesito importar algunos datos de un archivo de Excel y una carpeta con imágenes, cada fila de Excel describe cada entrada y tengo una lista de nombres de archivo en la carpeta (fotos relacionadas con la entrada).

He hecho un script que crea cada entrada en la base de datos y la guarda a través del shell django, pero no tengo idea de cómo crear una instancia de InMemoryUploadedFile para guardarlo con el modelo.

En django 1.0 tuve esta pequeña clase que me permitió hacer lo que necesitaba, pero con los cambios en django 1.1 ya no funciona.

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

Estaba usando esta clase con este código para cargar imágenes y guardarlas con la instancia del 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()

La pregunta es, ¿cómo creo un InMemoryUploadedFile o TemporaryUploadedFile a partir de un archivo en Python ?, o cualquier otra cosa que pueda funcionar en este contexto.

¿Fue útil?

Solución

Finalmente encontré la respuesta.

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

Otros consejos

Si usa Python 3 se necesita un ajuste: cambie 'r' a 'rb':

f = File(open(os.path.join(IMPORT_DIR, 'fotos', photo), 'rb'))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top