Question

Je dois importer des données d'un fichier Excel et d'un dossier avec des images. Chaque ligne d'Excel décrit chaque entrée et contient une liste de noms de fichiers dans le dossier (photos associées à l'entrée).

J'ai créé un script qui crée chaque entrée de la base de données et l'enregistre dans le shell Django, mais je ne sais pas comment instancier un fichier InMemoryUploaded pour l'enregistrer avec le modèle.

Dans Django 1.0, j'avais cette petite classe qui me permettait de faire ce dont j'avais besoin, mais avec les modifications apportées à Django 1.1, cela ne fonctionne plus.

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

J'utilisais cette classe avec ce morceau de code pour charger des images et les enregistrer avec l'instance de modèle.

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 question est de savoir comment créer un fichier InMemoryUploadedFile ou TemporaryUploadedFile à partir d’un fichier python? ou de tout autre élément susceptible de fonctionner dans ce contexte.

Était-ce utile?

La solution

Enfin, j'ai trouvé la réponse.

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

Autres conseils

Si vous utilisez Python 3 , un seul ajustement est nécessaire: remplacez "r" par "rb":

f = File(open(os.path.join(IMPORT_DIR, 'fotos', photo), 'rb'))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top