플러그형 MongoDB 스토리지를 사용하는 Django 문제
GridFS로만 스토리지 백엔드를 제공하기 위해 django와 mongo engine을 사용하려고 합니다.나는 아직 MySQL 데이터베이스를 가지고 있습니다.
저는 장고 관리자에서 삭제할 때 이상한 (나에게) 오류가 발생하여 제가 잘못하고 있는 것이 아닌가 생각하고 있습니다.
내 코드는 다음과 같습니다.
# 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)
파일을 업로드하는 데는 문제가 없지만 파일을 삭제하면 무언가가 손상되고 모든 FileDocument. 개체를 수동으로 삭제할 때까지 mongo 데이터베이스가 작동할 수 없는 상태가 됩니다.이 경우 장고 인터페이스에서 파일을 업로드하거나 삭제할 수 없습니다.
스택 추적에서 얻은 결과:
/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 스토리지 플러그인을 사용할 수 있었습니다.저는 결국 몽고 엔진을 전혀 사용하지 않게 되었습니다.저는 적응된 해결책을 github에 올렸습니다.사용 방법을 보여주는 명확한 샘플 프로젝트가 있습니다.저도 프로젝트를 pypi에 업로드했습니다.
다른 업데이트:
장고 보관 프로젝트를 적극 추천합니다.많은 스토리지 백업 옵션이 있으며 원래 제안했던 솔루션보다 훨씬 더 많은 사용자가 사용합니다.
Mongo Engine을 사용하지 않는 것이 좋을 것 같습니다, 저도 운이 별로 없습니다.다음은 다음과 같은 대체 제품입니다.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.
Django의 맞춤형 스토리지 설명서를 참조하여 유사한 질문에 대한 답변을 느슨하게 답했습니다.
언급URL : https://stackoverflow.com/questions/5041996/django-with-pluggable-mongodb-storage-troubles
'programing' 카테고리의 다른 글
| Apache POI가 있는 셀 참조 문자 식별자로 셀 가져오기 (0) | 2023.06.23 |
|---|---|
| 루비에서 명시적으로 반품하는 것이 좋은 스타일입니까? (0) | 2023.06.23 |
| 변환합니다.NetCore 대상.넷 프레임워크 (0) | 2023.06.23 |
| Management Studio 기본 파일 저장 위치 (0) | 2023.06.23 |
| WordPress 기사 게시 시 작은 문제 발생 (0) | 2023.06.23 |