【问题标题】:Django with mongodb using pymongo without using ORMDjango 与 mongodb 使用 pymongo 而不使用 ORM
【发布时间】:2017-09-01 11:32:10
【问题描述】:

我刚开始做一个项目, 我用的是Django1.10,我想用mongoDB作为后端...

我尝试了所有可能的方法,django-mongo-engine 需要 django-nonrel1.5, 但是如果我使用它,那么我必须做很多工作,而且它很复杂......

我也试过django-mongoengine,但它只在django1.9上测试过,(django 1.9不支持admin

所以现在我决定使用pymongo...

我需要帮助如何配置数据库?如何在没有 ORM 的情况下使用 django?

编辑

这是我的 setting.py 文件 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/')

然后我解雇了 cmnd

python manage.py runserver

我收到以下错误:-

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

【问题讨论】:

  • 请提供您尝试过的代码示例以及您希望实现的目标。
  • 请问为什么要用mongodb而不是django支持好的mysql或者postgres?
  • django-mongoengine repo 说项目不稳定。
  • @RaviKumar 这个项目需要非关系/nosql 数据库...

标签: python django mongodb pymongo


【解决方案1】:

如果您不想使用 ORM,则可以在 settings.py 中删除或注释掉 DATABASE = {}
一个解决方案是创建一个使用 pymongo 的连接器。 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)

现在你可以得到一个对象:

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

【讨论】:

    猜你喜欢
    • 2014-01-24
    • 2021-10-26
    • 2017-04-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 2015-11-12
    相关资源
    最近更新 更多