2011-02-18 12 views
28

Estoy tratando de usar django, y mongoengine para proporcionar el backend de almacenamiento solo con GridFS. Todavía tengo una base de datos MySQL.Django con problemas de almacenamiento MongoDB enchufables

Tengo un error extraño (para mí) cuando elimino el administrador de django y me pregunto si estoy haciendo algo incorrectamente.

mi código es el siguiente:

# settings.py 
from mongoengine import connect 
connect("mongo_storage") 

# models.py 
from mongoengine.django.storage import GridFSStorage 
class MyFile(models.Model): 
    name = models.CharField(max_length=50) 
    content = models.FileField(upload_to="appsfiles", storage=GridFSStorage()) 
    creation_time = models.DateTimeField(auto_now_add=True) 
    last_update_time = models.DateTimeField(auto_now=True) 

soy capaz de subir archivos muy bien, pero cuando se borra ellos, algo que parece romperse y la base de datos mongo parece estar en un estado inviable hasta que manualmente eliminar todos FileDocument.objects. Cuando esto sucede, no puedo cargar archivos o eliminarlos de la interfaz django.

Desde el seguimiento de la pila que tengo:

/home/projects/vector/src/mongoengine/django/storage.py in _get_doc_with_name 
     doc = [d for d in docs if getattr(d, self.field).name == name] ... 
▼ Local vars 
Variable Value 
_[1]  
[] 
d 

docs  
Error in formatting: cannot set options after executing query 
name  
u'testfile.pdf' 
self  

/home/projects/vector/src/mongoengine/fields.py in __getattr__ 
     raise AttributeError 

estoy usando esta función de forma incorrecta?

ACTUALIZACIÓN:

gracias a la respuesta de @ zeekay yo era capaz de conseguir un plugin de almacenamiento GridFS de trabajo para trabajar. Terminé sin usar mongoengine en absoluto. Puse mi solución adaptada en github. Hay un proyecto de muestra claro que muestra cómo usarlo. También subí el proyecto al pypi.

Otro Actualización:

lo recomiendo mucho el proyecto django-storages. Tiene muchas opciones respaldadas por almacenamiento y muchas más personas lo usan que mi solución original propuesta.

+0

He estado esperando hacer algo como esto para la instalación Mayan [link] (https://github.com/rosarior/mayan) en el trabajo. Pero no tengo idea de cómo solucionar tu problema. –

+0

No es exactamente lo que podría estar buscando, pero agregué un backend GridFsStorage para Mayan [link] (http://goo.gl/7BwkZ). Es muy simple y solo depende de Pymongo, podrías intentar usarlo para tu aplicación. –

+0

genial gracias, voy a echarle un vistazo este fin de semana – Aaron

Respuesta

8

Creo que es mejor que no uses MongoEngine para esto, tampoco he tenido mucha suerte con eso. Aquí hay un reemplazo directo para mongoengine.django.storage.GridFSStorage, que funciona con el administrador.

from django.core.files.storage import Storage 
from django.conf import settings 

from pymongo import Connection 
from gridfs import GridFS 

class GridFSStorage(Storage): 
    def __init__(self, host='localhost', port=27017, collection='fs'): 
     for s in ('host', 'port', 'collection'): 
      name = 'GRIDFS_' + s.upper() 
      if hasattr(settings, name): 
       setattr(self, s, getattr(settings, name)) 
     for s, v in zip(('host', 'port', 'collection'), (host, port, collection)): 
      if v: 
       setattr(self, s, v) 
     self.db = Connection(host=self.host, port=self.port)[self.collection] 
     self.fs = GridFS(self.db) 

    def _save(self, name, content): 
     self.fs.put(content, filename=name) 
     return name 

    def _open(self, name, *args, **kwars): 
     return self.fs.get_last_version(filename=name) 

    def delete(self, name): 
     oid = fs.get_last_version(filename=name)._id 
     self.fs.delete(oid) 

    def exists(self, name): 
     return self.fs.exists({'filename': name}) 

    def size(self, name): 
     return self.fs.get_last_version(filename=name).length 

GRIDFS_HOST, GRIDFS_PORT y GRIDFS_COLLECTION se puede definir en la configuración o pasa como host, port, collection argumentos clave a GridFSStorage en FileField de su modelo.

Me he referido a la documentación de Django custom storage, y sigilosamente seguí this answer a una pregunta similar.

+0

Genial, gracias! Hasta ahora no he notado ningún problema con esta solución. ¿Tienes un proyecto en Github o en cualquier lugar que contenga esto? Parece que podría servir bien a la comunidad si fuera fácil de encontrar y accesible. – Aaron

+0

¡No, intentaré empaquetarlo y pegarlo en pypi/github! – zeekay

+0

Hola Zeekay, realmente aprecio tu trabajo para que esto vaya en la dirección correcta. Puse un proyecto en github que usa una versión modificada de tu almacenamiento.py y tiene una aplicación de ejemplo para conectarla a una aplicación de django en funcionamiento: https://github.com/madisona/django-mongo-storage – Aaron

Cuestiones relacionadas