我想将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数据库吗?
答案 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