2009-05-11 21 views
5

Tôi muốn lưu trữ tập dữ liệu lớn được tạo bằng Python trong mô hình Django. Ý tưởng của tôi là để chọn dữ liệu vào một chuỗi và tải nó lên FileField của mô hình của tôi. mô hình django của tôi là:Làm cách nào để tải dữ liệu đã được chuyển lên django FileField?

#models.py 
from django.db import models 

class Data(models.Model): 
    label = models.CharField(max_length=30) 
    file = models.FileField(upload_to="data") 

Trong chương trình Python của tôi, tôi muốn làm như sau:

import random, pickle 

data_entry = Data(label="somedata") 
somedata = [random.random() for i in range(10000)] 
# Next line does NOT work 
#data_entry.file.save(filename, pickle.dumps(somedata)) 

Làm thế nào tôi nên sửa đổi dòng cuối cùng để lưu trữ somedata trong file bảo quản các đường dẫn được định nghĩa với upload_to tham số ?

+0

Vì vậy, chúng tôi đã rõ ràng: Bạn không nói về việc cho phép bất kỳ người dùng nào * tải lên bất kỳ dưa chua nào, đúng không? Đó sẽ là * cực kỳ * nguy hiểm, –

+0

Không, không hề. Ý tưởng là tạo ra dữ liệu trên máy chủ và sau đó thêm chúng vào cơ sở dữ liệu. Người dùng sẽ chỉ được phép sửa đổi các tham số của các mô hình được sử dụng để tạo ra dữ liệu (chẳng hạn như phạm vi của các số ngẫu nhiên trong ví dụ trên). Trong ý nghĩa này nó không phải là một "tải lên" thực sự, nhưng dù sao tôi muốn django để quản lý các đường dẫn (tạo thư mục mới, tránh trùng lặp, vv). – btel

Trả lời

-2

LƯU Ý: Xem các câu trả lời và nhận xét khác bên dưới - xóa thông tin cũ và liên kết bị hỏng (không thể xóa câu trả lời được chấp nhận một lần).

Marty Alchin có một phần về điều này trong chương 3 của Pro Django, review here.

+0

Cuốn sách này dường như không còn có sẵn miễn phí, trừ khi tôi bị nhầm lẫn. – DanH

+0

Đó chỉ là một phần. Có một bản xem trước trên amazon.com hoặc - nếu bạn thực sự không muốn trả Marty cho tất cả công việc khó khăn của mình: http://www.ittelkom.ac.id/staf/kms/TOT%20Phython/Pro_Django.pdf –

+0

Điều này trang web là câu trả lời không khuyến mãi. Câu trả lời này là vô dụng. –

0

Bạn có thể không lưu trữ dữ liệu của mình tốt hơn trong trường văn bản không? Nó không phải là một tập tin tải lên, sau khi tất cả.

+2

Dữ liệu có thể khá lớn nên tôi không muốn lưu trữ dữ liệu trong cơ sở dữ liệu. – btel

1

Trong cơ sở dữ liệu của bạn, thuộc tính tệp chỉ là đường dẫn đến tệp. Vì vậy, kể từ khi bạn không làm một tải lên thực tế, bạn cần phải lưu trữ các tập tin trên đĩa và sau đó lưu đường dẫn trong cơ sở dữ liệu.

f = open(filename, 'w') 
pickle.dump(somedata, f) 
f.close() 
data_entry.file=filename 
data_entry.save() 
+0

Cảm ơn bạn đã trả lời! Vấn đề là tôi vẫn muốn sử dụng FileField để tạo đường dẫn và tạo thư mục. – btel

0

Tôi chưa bao giờ làm điều này, nhưng dựa trên đọc một chút của mã có liên quan, tôi muốn bắt đầu bằng cách nhìn vào việc tạo ra một thể hiện của django.core.files.base.ContentFile và gán đó là giá trị của trường.

9

Dựa trên câu trả lời cho những câu hỏi tôi đã đưa ra các giải pháp sau đây:

from django.core.files.base import ContentFile 
import pickle 

content = pickle.dumps(somedata) 
fid = ContentFile(content) 
data_entry.file.save(filename, fid) 
fid.close() 

Tất cả của nó được thực hiện trên phía máy chủ và và người sử dụng không được phép tải lên dưa chua. Tôi đã thử nghiệm nó và nó hoạt động tốt, nhưng tôi mở cho bất kỳ đề xuất nào.

+0

đây là những gì tôi đã đề nghị –

Các vấn đề liên quan