如何与mongoengine一起使用django?

时间:2015-08-13 13:44:23

标签: python django mongodb

我想将mongodb数据库与django框架一起使用。为此,我尝试使用mongoengine和此描述设置一个小测试项目:http://staltz.com/djangoconfi-mongoengine/#/8

不幸的是,它不起作用。我的settings.py,views.py和models.py的相关部分如下所示:

settings.py:

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os
import mongoengine

[...]

# Application definition

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'testApp',
)
[...]

# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': '',
    }
}

SESSION_ENGINE = 'mongoengine.django.sessions'

_MONGODB_USER = 'mongouser'
_MONGODB_PASSWD = 'test'
_MONGODB_HOST = 'localhost'
_MONGODB_NAME = 'testDb'
_MONGODB_DATABASE_HOST = \
  'mongodb://%s:%s@%s/%s' \
  % (_MONGODB_USER, _MONGODB_PASSWD, _MONGODB_HOST, _MONGODB_NAME)

mongoengine.connect(_MONGODB_NAME, host=_MONGODB_DATABASE_HOST)

AUTHENTICATION_BACKENDS = (
    'mongoengine.django.auth.MongoEngineBackend',
)

models.py

from mongoengine import *

# Create your models here.
class Choice(Document):
  choice_text = StringField(max_length=200)

views.py

from django.shortcuts import render
from django.http import HttpResponse
from testApp.models import Choice
from django.contrib.auth import authenticate

def index(request):
  newChoice = Choice(choice_text="First test")
  newChoice.save()
  return HttpResponse("Test")

user = authenticate(username='mongouser', password='test')
assert isinstance(user, mongoengine.django.auth.User)

当我启动testserver并打开testApp网站时,我得到一个" ImportError:没有名为django.sessions"的模块。因此,我从settings.py中删除了SESSION_ENGINE部分,在上面的描述中将其标记为可选。之后我得到一个名为django.auth的#34; No模块"错误。

你知道出了什么问题以及如何与mongoengine一起设置django以使用mongodb数据库吗?

3 个答案:

答案 0 :(得分:4)

回答here。使用mongoengine 0.10,我们可以看到/usr/lib/python2.7/site-packages/mongoengine/中没有django包。使用sudo pip install mongoengine == 0.9安装mongoengine 0.9并使用django软件包(支持或扩展)。

答案 1 :(得分:0)

我想将mongodb数据库与django框架一起使用

如果这是您的目标,有几种方法可以实现它。根据您采取的策略,确定权衡因素。

使用MongoDB兼容模型框架(MongoEngine):您可以完全避免在项目中使用Django模型,并在django项目中使用MongoEngine或Ming。但是会错过:1500+ core contributors项目,每小时修复和票证解决方案,减少现有Django模型的专业知识,并加强新模型框架。错过Django的贡献模型,如Admin,Sessions,Users,Auth等,为您的项目贡献模块。

Django SQL到MongoDB转发器 - Djongo将Django ORM生成的Django SQL查询语法转换为pymongo命令。 Djongo是MongoDB查询编译器的一个这样的SQL。它将每个SQL查询字符串转换为mongoDB查询文档。因此,所有Django模型和相关模块都按原样工作。

答案 2 :(得分:0)

在 .env 文件中为数据库连接定义 envs:

DB_NAME=mock
DB_USER=test
DB_PASS=secret
HOST=localhost

在 app/settings.py 中:

import mongoengine

# Load envs
import environ
env = environ.Env()
env.read_env(env.str('ENV_PATH', '../.env'))
mongoengine.connect(db=env('DB_NAME'), host=env('HOST'), username=env('DB_USER'), password=env('DB_PASS'),serverSelectionTimeoutMS=1000)
DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.dummy',
     },
}


TEST_RUNNER = 'app.tests.NoSQLTestRunner'

在应用/测试中:

class NoSQLTestRunner(DiscoverRunner):
    def __init__(self, mocking, **kwargs):
        super().__init__(**kwargs)

    def setup_databases(self, **kwargs):
        pass

    def teardown_databases(self, old_config, **kwargs):
        pass

    def setup_test_environment(self, **kwargs):
        super(NoSQLTestRunner, self).setup_test_environment(**kwargs)

class NoSQLTestCase(TestCase):
    def __init__(self, *args, **kwargs):
        super(NoSQLTestCase, self).__init__(*args, **kwargs)

    @classmethod
    def setUpClass(cls):
        disconnect()
        connect('mongoenginetest', host='mongomock://localhost')

    @classmethod
    def tearDownClass(cls):
        disconnect()

    def _fixture_setup(self):
        pass

    def _fixture_teardown(self):
        pass

现在您可以创建 mongoengine 文档中表示的模型,并编写测试:

from app.tests import NoSQLTestCase
from myapp.models import MyModel

class CustodianOrganizationTest(NoSQLTestCase):
    def test_my_testcase(self)
        instance = MyModel()
        instance.save()
        assumed = "Foo"
        self.assertEqual(instance.foo, assumed)
   ...

并通过 python3 manage.py test

运行测试

此设置经测试成功运行:

python 3.9
Django 3.1.3
mongoengine 0.22.0
pymongo 3.11.2