基于 Mark 的出色回答 - 以下是如何根据模型的属性将模型读/写操作和迁移路由到不同的数据库
# app/models.py
class SomeModel(models.Model):
class params:
db = 'default'
class SomeOtherDbModel(models.Model):
class params:
db = 'otherdb'
...
# app/dbrouters.py
import app.models
allmodels = dict([(name.lower(), cls) for name, cls in app.models.__dict__.items() if isinstance(cls, type)])
...
class MyDBRouter(object):
def db_for_read(self, model, **hints):
""" reading model based on params """
return getattr(model.params, 'db')
def db_for_write(self, model, **hints):
""" writing model based on params """
return getattr(model.params, 'db')
def allow_migrate(self, db, app_label, model_name = None, **hints):
""" migrate to appropriate database per model """
model = allmodels.get(model_name)
return(model.params.db == db)
# app/settings.py
DATABASE_ROUTERS = ('app.dbrouters.MyDBRouter',)
...
DATABASES = {
...
'otherdb': {
....
}
}
在此处查看文档:https ://docs.djangoproject.com/en/3.0/topics/db/multi-db/#database-routers
model_name 参数在运行时作为 的小写形式传递model.__name__
,因此我们通过将此属性转换为小写来构建查找字典。
然后应该运行迁移
python3 manage.py migrate app --database default
python3 manage.py migrate app --database otherdb