Django с подключаемыми проблемами хранения MongoDB
Я пытаюсь использовать django и mongoengine, чтобы обеспечить бэкэнд хранилища только с GridFS. У меня все еще есть база данных MySQL.
Я сталкиваюсь со странной (для меня) ошибкой при удалении из администратора django и задаюсь вопросом, не делаю ли я что-то неправильно.
Мой код выглядит так:
# 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)
Я могу загружать файлы просто отлично, но когда я удаляю их, что-то, кажется, ломается, и база данных mongo, кажется, находится в нерабочем состоянии, пока я вручную удалите все FileDocument.объекты. Когда это происходит, я не могу загружать файлы или удалять их из интерфейса django.
Из трассировки стека у меня есть:
/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
Я неправильно использую эту функцию?
Обновление:
Благодаря ответу @zeekay я смог получить работающий плагин для хранения gridfs. В итоге я не через mongoengine вообще. Я поместил свое адаптированное решение на github. Существует четкий пример проекта, показывающий, как его использовать. Я также загрузил проект в pypi.
Еще Одно Обновление:
Я бы очень рекомендовал проект django-storages. Он имеет множество вариантов хранения данных и используется гораздо большим количеством людей, чем мое оригинальное предлагаемое решение.
1 ответ:
Я думаю, что вам лучше не использовать для этого MongoEngine, мне тоже не очень повезло. Вот выпадающая замена для
mongoengine.django.storage.GridFSStorage
, которая работает с администратором.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
иGRIDFS_COLLECTION
можно определить в настройках или передать какhost
,port
,collection
ключевые слова аргументов дляGridFSStorage
в вашей моделиFileField
.Я сослался на документацию пользовательского хранилища Джанго и свободно последовал этому ответу на аналогичный вопрос.