Django with Pluggable MongoDB Storage troubles Django with Pluggable MongoDB Storage troubles mongodb mongodb

Django with Pluggable MongoDB Storage troubles


I think you are better off not using MongoEngine for this, I haven't had much luck with it either. Here is a drop-in replacement for mongoengine.django.storage.GridFSStorage, which works with the admin.

from django.core.files.storage import Storagefrom django.conf import settingsfrom pymongo import Connectionfrom gridfs import GridFSclass 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 and GRIDFS_COLLECTION can be defined in your settings or passed as host, port, collection keyword arguments to GridFSStorage in your model's FileField.

I referred to Django's custom storage documenation, and loosely followed this answer to a similar question.