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.