如何将序列化数据上传到Django的FileField?

6 投票
5 回答
3641 浏览
提问于 2025-04-15 11:30

我想把在Python中生成的大数据集存储到Django模型里。我的想法是把数据转成字符串,然后上传到我模型的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 个回答

1

在你的数据库中,file 属性其实就是一个文件的路径。所以,由于你并没有真正上传文件,你需要先把文件存储到磁盘上,然后再把这个路径保存到数据库里。

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

根据我对问题的回答,我想出了以下解决方案:

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

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

这一切都是在服务器端完成的,用户不能上传任何“腌黄瓜”(这里指的是一种数据格式)。我测试过了,效果很好,但我也欢迎任何建议。

-3

注意:请查看下面的其他回答和评论 - 旧的信息和失效的链接已被删除(无法删除曾被接受的回答)。

Marty Alchin在《Pro Django》第三章中有相关内容,可以在这里查看评论

撰写回答