2009-08-05 5 views
11

Potrzebuję zaimportować niektóre dane z pliku Excela i folderu z obrazami, każdy wiersz w programie Excel opisuje każdy wpis i ma listę nazw plików w folderze (zdjęcia związane z wpisem)."Prześlij" plik z powłoki django

Zrobiłem skrypt, który tworzy każdy wpis w bazie danych i zapisuje go przez powłokę django, ale nie mam pojęcia, jak utworzyć instancję InMemoryUploadedFile, aby zapisać ją w modelu.

W django 1.0 miałem małą klasę, która pozwoliła mi zrobić to, czego potrzebuję, ale ze zmianami w django 1.1 to już nie działa.

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

Używam tej klasy z tym kodem do ładowania obrazów i zapisywania ich za pomocą instancji modelu.

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

Chodzi o to, w jaki sposób mogę utworzyć InMemoryUploadedFile lub TemporaryUploadedFile z pliku w python ?, lub jakiejkolwiek innej rzeczy, która może pracować w tym kontekście.

Odpowiedz

18

W końcu znalazłem odpowiedź.

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

więc zmieniło się od dokonywania obiekt ImportFile dokonaniem obiekt File? A ImportFile pochodzi z pliku, a nie z pliku? Wygląda na to, że mógłbyś to naprawić, wyprowadzając ImportFile z File, ale nie jestem pewien, co ImportFile dodawał do równania. Z przedstawionego kodu nie wynikało ono z wyspecjalizowanego zachowania. – hughdbrown

+0

Po pierwsze, gdy próbowałem pracować z obiektem pliku django podniósł kilka wyjątków takich jak "f nie ma porcji atrybutów", więc stworzyłem tę klasę i napisałem wszystkie atrybuty potrzebne do pracy. – hchinchilla

4

przypadku używania jest potrzebny Python 3 jedna regulacja - zmiana 'R' do 'rb':

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