Me gustaría almacenar grandes conjuntos de datos generados en Python en un modelo Django. Mi idea era seleccionar los datos en una cadena y subirlos a FileField de mi modelo. Mi modelo de django es:

#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 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 debo modificar la última línea para almacenar somedata en file preservando las rutas definidas con el parámetro upload_to?

5
btel 11 may. 2009 a las 16:36

5 respuestas

La mejor respuesta

NOTA: Vea otras respuestas y comentarios a continuación : se eliminó la información anterior y los enlaces rotos (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, revisar aquí.

-2
Dave Everitt 18 ago. 2015 a las 11:32

Nunca he hecho esto, pero basándome en leer un poco del código relevante, comenzaría por buscar crear una instancia de django.core.files.base.ContentFile y asignarlo como el valor del campo.

0
Carl Meyer 11 may. 2009 a las 15:21

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

0
Dominic Rodger 11 may. 2009 a las 12:40

Basado en las respuestas a las preguntas, se me 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 se hace en el lado del servidor y los usuarios NO pueden cargar pepinillos. Lo probé y funciona bien, pero estoy abierto a cualquier sugerencia.

9
btel 11 may. 2009 a las 20:33

En su base de datos, el atributo archivo es solo una ruta al archivo. Por lo tanto, dado que no está realizando una carga real, debe 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()
1
Sergey Golovchenko 11 may. 2009 a las 13:46