我想在Django模型中存储Python生成的大型数据集。我的想法是将数据pickle到字符串并将其上传到我的模型的FileField。我的django模型是:
#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))
如何修改somedata
中存储file
的最后一行,保留使用upload_to
参数定义的路径?
答案 0 :(得分: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()
所有这些都在服务器端完成,并且不允许用户上传pickles。我测试了它并且它工作正常,但我对任何建议持开放态度。
答案 1 :(得分:1)
在您的数据库中,文件属性只是文件的路径。因此,由于您没有进行实际上传,因此需要将文件存储在磁盘上,然后将路径保存在数据库中。
f = open(filename, 'w')
pickle.dump(somedata, f)
f.close()
data_entry.file=filename
data_entry.save()
答案 2 :(得分:0)
你最好不要将数据存储在文本字段中吗?毕竟,这不是文件上传。
答案 3 :(得分:0)
我从来没有这样做过,但是基于阅读相关代码的一些内容,我首先考虑创建一个django.core.files.base.ContentFile的实例并将其指定为该字段的值
答案 4 :(得分:-2)
注意:请参阅下面的其他答案和评论 - 删除旧信息和损坏的链接(无法删除曾经接受的答案)。
Marty Alchin在Pro Django的第3章中有一节,review here。