Django with mongodb using pymongo without using ORM

本秂侑毒 提交于 2020-06-11 10:39:25

问题


I just started working on a project, I am using Django1.10, I wanted to use mongoDB as backend...

I tried all possible ways, django-mongo-engine requires django-nonrel1.5, but if I used it then I have to do lot of work, and its complicated...

I tried django-mongoengine also but it was only tested on django1.9, (django 1.9 not supporting admin)

So now I decided to use pymongo...

I need help How can I configure database? and How to work with django without ORM?

EDIT :

This is my setting.py file with django-mongoengine

settings.py

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SECRET_KEY = '------------'
DEBUG = True
ALLOWED_HOSTS = []

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'mongoengine',
    'LocalTeamsApp'
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'LocalTeams.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'LocalTeams.wsgi.application'

# MongoDB settings
MONGODB_DATABASES = {
    'default': {'name': 'django_mongoengine'}
}

DATABASES = {
    "default": {
        "NAME": '****',
        "PASSWORD": '****',
        "USER": '****',
        'ENGINE':'django.db.backends.dummy'
    }
}

INSTALLED_APPS += ["django_mongoengine"]


AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

AUTH_USER_MODEL = 'mongo_auth.MongoUser'

AUTHENTICATION_BACKENDS = (
    'django_mongoengine.mongo_auth.backends.MongoEngineBackend',
)

SESSION_ENGINE = 'django_mongoengine.sessions'

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

Then I fired the cmnd

python manage.py runserver

I got following error:-

Unhandled exception in thread started by <function wrapper at 0x7f8648b43ed8>
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/django/utils/autoreload.py", line 226, in wrapper
    fn(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/runserver.py", line 113, in inner_run
    autoreload.raise_last_exception()
  File "/usr/local/lib/python2.7/dist-packages/django/utils/autoreload.py", line 249, in raise_last_exception
    six.reraise(*_exception)
  File "/usr/local/lib/python2.7/dist-packages/django/utils/autoreload.py", line 226, in wrapper
    fn(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/__init__.py", line 27, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/usr/local/lib/python2.7/dist-packages/django/apps/registry.py", line 85, in populate
    app_config = AppConfig.create(entry)
  File "/usr/local/lib/python2.7/dist-packages/django/apps/config.py", line 90, in create
    module = import_module(entry)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: No module named django_mongoengine

回答1:


If you don't want to use the ORM then you can delete or comment out DATABASE = {} in settings.py.
A solution would be to create a connector that uses pymongo. Example of mongodb_connector.py:

from pymongo import MongoClient
from bson.json_util import dumps

class MongoConnector:
    username = 'user'
    password = 'pass'
    host = 'localhost'
    port = '27017'
    url = host + ':' + port
    client = MongoClient(mongo_url,username=username,password=password,authSource='admin',authMechanism='SCRAM-SHA-256')
    def find(self,db, collection, name):
        db = client[db]
        collection = db[collection]
        response = collection.find_one({"name":str(name)})
        return dumps(response)

Now you can get an object with:

from mongo_connector import MongoConnector
mongo = MongoConnector()
doc = mongo.find('mydb','mycollection','name')


来源:https://stackoverflow.com/questions/43255122/django-with-mongodb-using-pymongo-without-using-orm

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!