2009-05-11 63 views
5

我想将在Python中生成的大型数据集存储在Django模型中。我的想法是将数据腌制成字符串并将其上传到我的模型的FileField。我的Django的模式是:如何将腌渍数据上传到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") 

在我的Python程序,我想做到以下几点:

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

我应该如何修改的最后一行存储somedatafile保持与upload_to参数定义的路径?

+0

就这样我们很清楚:你不是在说让任何*用户上传任何泡菜,对吧?那会非常危险, – 2009-05-11 15:26:28

+0

不,完全没有。这个想法是在服务器上生成数据,然后将它们添加到数据库中。用户只能修改用于生成数据的模型参数(例如上例中的随机数范围)。从这个意义上讲,它不是一个真正的“上传”,但无论如何,我希望Django管理路径(创建新目录,避免重复等)。 – btel 2009-05-11 15:40:58

回答

-2

注:见其他答案及以下评论 - 旧信息,并删除损坏的链接(不能删除一个曾经接受的答案)。

Marty Alchin在Pro Django的第3章review here的第3章有关于此的章节。

+0

这本书似乎不再免费提供,除非我错了。 – DanH 2012-10-09 08:49:05

+0

这只是一个部分。在amazon.com上有预览,或者 - 如果你真的不想向Marty付出他所有的辛勤工作:http://www.ittelkom.ac.id/staf/kms/TOT%20Phython/Pro_Django.pdf – 2012-10-09 14:26:28

+0

This网站是为了解答而不是提升。这个答案是无用的。 – 2013-02-21 18:15:53

0

可能你不是更好地将数据存储在文本字段中吗?毕竟,这不是文件上传。

+2

数据可能非常大,所以我不希望将其存储在数据库中。 – btel 2009-05-11 12:41:06

1

在你的数据库中文件属性只是文件的路径。因此,由于您没有进行实际上传,因此您需要将文件存储在磁盘上,然后将路径保存到数据库中。

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

感谢您的回答!问题是我仍想使用FileField来生成路径和创建目录。 – btel 2009-05-11 14:21:40

0

我从来没有这样做,而是基于阅读了一下相关的代码,我会通过寻找到创建django.core.files.base.ContentFile的一个实例,分配起动,作为该字段的值。

9

基于该问题的答案,我想出了以下解决方案:

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

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

所有这一切都在服务器端完成,并且不允许用户上传咸菜。我测试了它,它工作得很好,但我愿意接受任何建议。

+0

这是我会建议的 – 2009-06-18 08:26:28