对于遇到我遇到的问题的任何人,这是我最终解决的问题:
routers.py:
from django.conf import settings
class DatabaseAppsRouter(object):
def db_for_read(self, model, **hints):
# your db routing
def db_for_write(self, model, **hints):
# your db routing
def allow_relation(self, obj1, obj2, **hints):
# your db routing
def allow_syncdb(self, db, model):
# your db routing
def allow_migrate(self, db, app_label, model_name=None, **hints):
if db in settings.DATABASE_APPS_MAPPING.values():
return settings.DATABASE_APPS_MAPPING.get(app_label) == db
elif app_label in settings.DATABASE_APPS_MAPPING:
return False
settings.py
DATABASE_ROUTERS = ['project.routers.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {'contenttypes': 'default',
'auth': 'default',
'admin': 'default',
'sessions': 'default',
'messages': 'default',
'staticfiles': 'default',
'myapp': 'mydb',
}
这个设置让我可以运行两个命令:
python manage.py migrate
python manage.py migrate --database=mydb
这仍然是一对多,但至少现在我不能错误地将 myapp 迁移到默认数据库,我想承认这种情况发生的次数更多。
警告 - 咆哮:
到目前为止,我发现 Django 的设计很古怪,但非常合乎逻辑且对程序员友好,就像 python 本身一样。但是迁移与多个数据库设置交互的方式非常不方便,因此很容易用不需要的表淹没默认数据库。
凯文在他的回答中链接的讨论表明,我不是唯一一个遇到这种困难的人。