2009-08-05 13 views
11

Necesito importar algunos datos de un archivo Excel y una carpeta con imágenes, cada fila en el excel describe cada entrada y tiene una lista de nombres de archivos en la carpeta (fotos relacionadas con la entrada)"Cargar" un archivo desde el shell django

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 tenía esta pequeña clase que me permitía hacer lo que necesitaba, pero con los cambios en django 1.1 ya no funcionaba.

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 puedo crear un InMemoryUploadedFile o TemporaryUploadedFile de un archivo en Python ?, o cualquier otra cosa que podría trabajar en este contexto.

Respuesta

18

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

Así que cambió de hacer un objeto IMPORTFILE a hacer un objeto File? ¿Y ImportFile se derivó del archivo, no del archivo? Parece que pudiste haber solucionado esto al derivar ImportFile de File, pero luego no estoy seguro de lo que ImportFile estaba agregando a la ecuación. Del código presentado, no parecía tener un comportamiento especializado. – hughdbrown

+0

Primero, cuando traté de trabajar con un objeto de archivo, django generó algunas excepciones como "f no tiene fragmentos de atributo", así que creé esta clase y escribí todos los atributos necesarios para trabajar. – hchinchilla

4

Si es necesario el uso de Python 3 un ajuste - el cambio 'r' a 'rb':

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