【问题标题】:How to use django together with mongoengine?如何将 django 与 mongoengine 一起使用?
【发布时间】:2021-03-09 16:07:53
【问题描述】:

我想将 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: No module named django.sessions”。因此,我从我的 settings.py 中删除了 SESSION_ENGINE 部分,该部分在上面的描述中被标记为可选。之后我收到“没有名为 django.auth 的模块”错误。

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

【问题讨论】:

  • 您使用的是哪个版本的 Django、mongoengine 和 pymongo?
  • 抱歉,回答迟了。周末没上机:Django 1.8.2 mongoengine 0.10.0 pymongo 3.0.2 但其实我没有用pymongo。
  • 你能告诉我你从哪里找到 _MONGODB_PASSWD 和 _MONGODB_USER 吗? @rahul-gupta
  • @AdarshTiwari 这是您的 MongoDB 用户名和密码。

标签: python django mongodb


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我想结合 django 框架使用 mongodb 数据库

    如果这是您的目标,有多种方法可以实现。根据您采取的策略,考虑权衡。

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

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

    【讨论】:

      【解决方案3】:

      在 Django 中使用最新版本的 pymongo 存在一些问题。

      尝试将pymongo 降级到 2.8,它应该可以工作。

      【讨论】:

        【解决方案4】:

        在 .env 文件中定义用于数据库连接的环境:

        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
        

        【讨论】:

          猜你喜欢
          • 2015-08-06
          • 1970-01-01
          • 1970-01-01
          • 2018-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-19
          • 2019-09-04
          相关资源
          最近更新 更多