"Subir" un archivo desde el shell django
-
22-07-2019 - |
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.
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'))