Как загрузить маринованные данные в django FileField? - PullRequest
5 голосов
/ 11 мая 2009

Я хотел бы хранить большой набор данных, сгенерированный в Python, в модели 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))

Как мне изменить последнюю строку для сохранения somedata в file, сохраняя пути, определенные с параметром upload_to?

Ответы [ 5 ]

9 голосов
/ 11 мая 2009

На основании ответов на вопросы я нашел следующее решение:

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

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

Все это делается на стороне сервера, и пользователям НЕ разрешается загружать соленья. Я проверил это, и все отлично работает, но я открыт для любых предложений.

1 голос
/ 11 мая 2009

В вашей базе данных атрибут file - это просто путь к файлу. Итак, поскольку вы не выполняете фактическую загрузку, вам нужно сохранить файл на диске, а затем сохранить путь в базе данных.

f = open(filename, 'w')
pickle.dump(somedata, f)
f.close()
data_entry.file=filename
data_entry.save()
0 голосов
/ 08 июля 2009

ПРИМЕЧАНИЕ: См. Другие ответы и комментарии ниже - старая информация и неработающие ссылки удалены (невозможно удалить один раз принятый ответ).

У Марти Алчина есть раздел на эту тему в главе 3 Pro Django, обзор здесь .

0 голосов
/ 11 мая 2009

Я никогда не делал этого, но, основываясь на чтении соответствующего кода, я бы начал с создания экземпляра django.core.files.base.ContentFile и присвоения его в качестве значения поля .

0 голосов
/ 11 мая 2009

Не лучше ли хранить ваши данные в текстовом поле? В конце концов, это не загрузка файла.

...