2009-08-05 32 views
11

Tôi cần nhập một số dữ liệu từ tệp excel và thư mục có hình ảnh, mỗi hàng trong excel mô tả mọi mục nhập và có danh sách tên tệp trong thư mục (ảnh liên quan đến mục nhập)."Tải lên" tệp từ django shell

Tôi đã thực hiện một tập lệnh tạo mọi mục nhập trong cơ sở dữ liệu và lưu nó vào vỏ django, nhưng tôi không biết làm thế nào để tạo một InMemoryUploadedFile để lưu nó với mô hình.

Trong django 1.0 tôi đã có lớp học nhỏ này cho phép tôi làm những gì tôi cần, nhưng với những thay đổi trong django 1.1 nó không làm việc nữ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() 

Tôi đã sử dụng lớp này với đoạn mã này để tải hình ảnh và lưu chúng bằng ví dụ mẫu.

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

Câu hỏi đặt ra là, làm thế nào để tạo ra một InMemoryUploadedFile hoặc TemporaryUploadedFile từ một tập tin trong python ?, hoặc bất cứ điều gì khác mà có thể làm việc trong bối cảnh này.

Trả lời

18

Cuối cùng tôi đã tìm thấy câu trả lời.

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

Vì vậy, bạn thay đổi từ làm cho một đối tượng ImportFile để làm cho một đối tượng File? Và ImportFile có nguồn gốc từ tệp, không phải tệp? Có vẻ như bạn có thể sửa lỗi này bằng cách lấy ImportFile từ Tệp, nhưng sau đó tôi không chắc ImportFile đã thêm vào phương trình. Từ mã trình bày, nó dường như không có nhiều hành vi chuyên biệt. – hughdbrown

+0

Đầu tiên, khi tôi cố gắng làm việc với một đối tượng tập tin, django đã nêu ra một số ngoại lệ như "f không có khối thuộc tính" vì vậy tôi đã tạo lớp này và viết tất cả các thuộc tính cần thiết để làm việc. – hchinchilla

4

Nếu sử dụng Python 3 một điều chỉnh là cần thiết - thay đổi 'r' thành 'rb':

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