& # 8220; Télécharger & # 8221; un fichier de django shell
-
22-07-2019 - |
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.
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'))