我正在创建一个名为'db_manager'的应用程序的Django项目。我想创建两个db:一个用于db_manager模型,一个用于核心django模型(auth,admin,contentTypes,session ...)
首先,我运行迁移以在adw_core db中创建核心模型。然后,我运行迁移以在adw_facts db中创建db_manager模型。我用这个命令:
python manage.py migrate db_manager --database adw_facts
我设置了路由器,将应用程序指向适当的数据库:
settings.py
DATABASE_ROUTERS = ['data_warehouse.db_routers.DatabaseRouter']
MAP_APPS_TO_DB = {
'db_manager': 'adw_facts',
'django.contrib.auth': 'adw_core',
'django.contrib.sessions': 'adw_core',
}
db_routers.py
class DatabaseRouter(object):
def db_for_read(self, model, **hints):
if model._meta.app_label in settings.MAP_APPS_TO_DB:
return settings.MAP_APPS_TO_DB[model._meta.app_label]
return None
def db_for_write(self, model, **hints):
if model._meta.app_label in settings.MAP_APPS_TO_DB:
return settings.MAP_APPS_TO_DB[model._meta.app_label]
return None
def allow_relation(self, obj1, obj2, **hints):
# Allow any relation between apps that use the same database.
db_obj1 = settings.MAP_APPS_TO_DB.get(obj1._meta.app_label)
db_obj2 = settings.MAP_APPS_TO_DB.get(obj2._meta.app_label)
if db_obj1 and db_obj2:
if db_obj1 == db_obj2:
return True
else:
return False
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label in settings.MAP_APPS_TO_DB:
return db == settings.MAP_APPS_TO_DB[app_label]
return None
当我运行迁移以在adw_facts db中创建db_manager模型时,我收到以下错误:
RuntimeError: Error creating new content types. Please make sure contenttypes is migrated before trying to migrate apps individually.
我确认表'core_db.django_content_type'存在。问题必须是django.contrib.contenttypes
应用程序尝试在adw_facts db中为db_manager创建contentTypes,但是表core_db.django_content_type在adw_core db中。
我不想删除contenttypes应用程序,因为我将其与其他Django功能一起使用。
我可以想到以下解决方案:
禁用事实模型的内容类型
为facts_db
这些都不是很有吸引力。如果您有更好的解决方案,请告诉我。
答案 0 :(得分:0)
只是面临相同的问题(在django 2.1上)。 根据@Tony提到的文档,似乎您需要从每个数据库中的多个Django组件中复制数据。 这是对我有用的东西:
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label in ('sites', 'contenttypes', 'auth'):
return True
if app_label in settings.MAP_APPS_TO_DB:
return db == settings.MAP_APPS_TO_DB[app_label]
return None