2009-05-11 2 views
5

Я хотел бы хранить большой набор данных, сгенерированный в Python, в модели Django. Моя идея состояла в том, чтобы распиливать данные в строку и загрузить ее в FileField моей модели. Моя модель Джанго является:Как загрузить маринованные данные в 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 параметром ?

+0

Просто так мы поняли: вы не говорите о том, чтобы позволить * * пользователям загружать любые соленые огурцы, не так ли? Это было бы чрезвычайно опасно, –

+0

Нет, совсем нет. Идея состоит в том, чтобы генерировать данные на сервере, а затем добавлять их в базу данных. Пользователям будет разрешено изменять параметры моделей, используемых для генерации данных (например, диапазон случайных чисел в приведенном выше примере). В этом смысле это не настоящая «загрузка», но в любом случае я хотел бы, чтобы django управлял путями (создавать новые каталоги, избегать дубликатов и т. Д.). – btel

ответ

-2

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

У Marty Alchin есть раздел об этом в главе 3 Pro Django, review here.

+0

. Книга, похоже, больше не доступна бесплатно, если только я не ошибаюсь. – DanH

+0

Это был просто раздел. Есть предварительный просмотр на amazon.com или - если вы действительно не хотите платить Марти за всю свою тяжелую работу: http://www.ittelkom.ac.id/staf/kms/TOT%20Phython/Pro_Django.pdf –

+0

Это сайт предназначен для ответов, а не для продвижения по службе. Этот ответ бесполезен. –

0

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

+2

Данные могут быть довольно большими, поэтому я бы предпочел не хранить их в базе данных. – btel

1

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

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

Спасибо за ответ! Проблема в том, что я бы хотел использовать FileField для создания путей и создания каталогов. – btel

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

Это то, что я бы рекомендовал –

 Смежные вопросы

  • Нет связанных вопросов^_^