27 votes

Django avec Enfichable MongoDB Stockage des ennuis

Je suis en train d'utiliser django, et mongoengine de fournir le backend de stockage uniquement avec GridFS. J'ai encore une base de données MySQL.

Je suis en cours d'exécution dans un étrange (pour moi) d'erreur quand je suis à la suppression de l'django admin et je me demande si je fais quelque chose de mal.

mon code ressemble à ceci:

# 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)

Je suis capable de télécharger des fichiers, mais lorsque je les supprimer, quelque chose semble se briser et la base de données mongo semble entrer dans un état impraticable jusqu'à ce que j'ai supprimer manuellement tous les FileDocument.objets. Quand cela arrive, je ne peux pas télécharger des fichiers ou de les supprimer de l'django interface.

À partir de la trace de la pile que j'ai:

/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 

Suis-je utiliser cette fonction de manière incorrecte?

Mise à JOUR:

grâce à @zeekay la réponse que j'ai été en mesure d'obtenir un travail gridfs de stockage plugin fonctionne. J'ai fini pas à l'aide de mongoengine à tous. J'ai mis ma solution adaptée sur github. Il est clair qu'un exemple de projet en montrant comment l'utiliser. J'ai aussi téléchargé le projet de pypi.

Une Autre Mise À Jour:

Je recommande fortement le django-les stockages de projet. Il a beaucoup de rangement adossés à des options et est utilisé par beaucoup plus de personnes que mon original de la solution proposée.

7voto

zeekay Points 22640

Je pense que vous êtes mieux de ne pas utiliser MongoEngine pour cela, je n'ai pas eu beaucoup de chance avec elle. Voici une baisse-dans le remplacement pour mongoengine.django.storage.GridFSStorage, qui travaille avec l'admin.

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 et GRIDFS_COLLECTION peut être définie dans les paramètres ou passé en host, port, collection mot-clé arguments au GridFSStorage dans votre modèle FileField.

J'ai appelé Django de stockage personnalisé documenation, et lâche suivi cette réponse à une question similaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X