“Subir” un archivo desde el shell django

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

He realizado una secuencia de comandos 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 guardarla con el modelo.

En django 1.0 tuve esta clase pequeña que me permitió hacer lo que necesito, 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 fragmento de 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 desde un archivo en Python ?, o cualquier otra cosa que pueda funcionar en este contexto.

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

Si usar Python 3 es necesario un ajuste, cambie ‘r’ a ‘rb’:

 f = File(open(os.path.join(IMPORT_DIR, 'fotos', photo), 'rb'))