2009-05-11 10 views
5

Me gustaría almacenar grandes conjuntos de datos generados en Python en un modelo de Django. Mi idea era reunir los datos en una cadena y subirlos a FileField de mi modelo. Mi modelo de Django es:¿Cómo cargo datos en escabeche a 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") 

En mi programa de Python me gustaría hacer lo siguiente:

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)) 

Cómo debería modificar la última línea para almacenar somedata en file preservar las rutas definidas con upload_to parámetro ?

+0

Solo para que quede claro: no estamos hablando de dejar que * usuarios * carguen pepinillos, ¿verdad? Eso sería * extremadamente * peligroso, –

+0

No, en absoluto. La idea es generar los datos en el servidor y luego agregarlos a la base de datos. Los usuarios solo podrán modificar los parámetros de los modelos utilizados para generar los datos (como el rango de los números aleatorios en el ejemplo anterior). En este sentido, no es una "carga" real, pero de todos modos me gustaría que django administre las rutas (crear directorios nuevos, evitar duplicados, etc.). – btel

Respuesta

-2

NOTA: Ver otras respuestas y comentarios a continuación - información antigua y enlaces rotos eliminado (no se puede eliminar una respuesta aceptada una vez).

Marty Alchin tiene una sección sobre esto en el capítulo 3 de Pro Django, review here.

+0

Parece que el libro ya no está disponible de forma gratuita, a menos que esté equivocado. – DanH

+0

Eso era solo una sección. Hay una vista previa en amazon.com o, si realmente no quieres pagarle a Marty por todo su arduo trabajo: http://www.ittelkom.ac.id/staf/kms/TOT%20Phython/Pro_Django.pdf –

+0

This el sitio es para respuestas, no promoción. Esta respuesta es inútil. –

0

¿No sería mejor que guarde sus datos en un campo de texto? No es una carga de archivos, después de todo.

+2

Los datos pueden ser bastante grandes, por lo que preferiría no almacenarlos en la base de datos. – btel

1

En su base de datos, el atributo es solo una ruta de acceso al archivo. Entonces, como no está haciendo una carga real, necesita almacenar el archivo en el disco y luego guardar la ruta en la base de datos.

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

¡Gracias por la respuesta! El problema es que aún me gustaría utilizar FileField para generar rutas y crear directorios. – btel

0

que nunca he hecho esto, pero basado en la lectura de un bit del código en cuestión, me gustaría empezar por mirar en la creación de una instancia de django.core.files.base.ContentFile y la asignación de que a medida que la valor del campo

9

Sobre la base de las respuestas a las preguntas que se le ocurrió la siguiente solución:

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

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

Todo ello se realiza en el lado del servidor y los usuarios no están autorizados a subir encurtidos. Lo probé y funciona todo bien, pero estoy abierto a cualquier sugerencia.

+0

esto es lo que habría recomendado –

Cuestiones relacionadas