如何将pickle数据上传到django FileField?

时间:2009-05-11 12:36:39

标签: python django file upload pickle

我想在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参数定义的路径?

5 个答案:

答案 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