Mongoengine的装置与Django无法正常工作

时间:2015-12-19 09:46:00

标签: python django mongodb django-rest-framework mongoengine

我使用Mongoengine(版本:0.9.0)和Django(版本:1.8)。 这是我的settings.py

DATABASES = {
 'default': {
   'ENGINE': 'django.db.backends.dummy'
    }
  }  
MONGO_DBNAME = "mydatabasename"
MONGO_HOSTNAME = "localhost"

connect(MONGO_DBNAME, host=MONGO_HOSTNAME)

我想为应用程序安装灯具。我在myapp / fixtures / location中创建了initial_data.json。

当我运行命令python manage.py dumpdata时,出现以下错误:

  

CommandError:无法序列化数据库:settings.DATABASES配置不正确。请提供ENGINE值。检查设置文档以获取更多详细信息。

问题:

1)此问题的解决方法是什么?

2)是否有其他方法可以加载初始数据?

References此链接

谢谢

2 个答案:

答案 0 :(得分:0)

Mongoengine是一个后端(在django术语中)。它有自己的模型(模式)和DOM(像docuemnt db中的ORM),但它没有Django后端适配器。

你可以使用它。但是在使用开箱即用的Django解决方案(如测试,夹具等)时会遇到问题。 你需要编写自己的装载机,但却是真实的。

我在这里看到两个选项:

我编写自己的夹具加载器进行测试。 我有一个json文件,其中映射所有fixture文件生病需要加载到db。 这是一个快速的例子:

import bson
import os
from django.conf import settings
from mongoengine.connection import get_db

def _get_db(self):
    self.db = get_db()

def _load_fixtures(self, clear_before_load=True):
    """
    Load to db a fixtures from folder fixtures/{{DB_NAME}}/{{COLLECTION_NAME}} before each test.
    In file fixtures.json mapped collection name and file name for it.
    """
    fixture_path = lambda file_name: os.path.join(settings.FIXTURES_DIR, self.db.name, file_name)
    with open(settings.COLLECTION_FIXTURES_PATH) as file_object:
        db_collections = loads(file_object.read())
        for collection_name, filename in db_collections.items():
            collection = self.db[collection_name]
            if clear_before_load:
                collection.remove()
            path = fixture_path(filename)
            if os.path.exists(path) and os.path.isfile(path):
                with open(path, 'r') as raw_data:
                    collection_data = bson.decode_all(raw_data.read())
                    for document in collection_data:
                        collection.save(document)

答案 1 :(得分:0)

mongoengine上没有对灯具的支持,我认为mongoengine团队从版本0.9.0开始继续插件。

我最终为mongoDB加载初始数据的目的是在我的项目文件夹中创建一个名为startup.py的脚本。

startup.py:

from {{app}}.models import Sample

def init():
    if Sample.objects(name="test").count() == 0: # a flag to prevent initial data repetition
        Sample(name="test").save()

接下来是在Django的创业公司上运行这个脚本。 Django项目的入口点是DJANGO_SETTINGS_MODULE首次加载wsgi.py时:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{project_name}}.settings")

import {{project_name}}.startup as startup
startup.init()

application = get_wsgi_application()

使用此设置,当您运行python manage.py runserver时,init()上的startup.py将会运行,您设置的数据将会插入到数据库中。

希望这有帮助。