首页 > 解决方案 > 在 django 中,如果我有多个数据库,我如何告诉 django 在哪个数据库中创建哪个模型表?

问题描述

例如我有这两个数据库。现在在创建模型类时,我如何告诉 django 在“电影”数据库而不是“默认”数据库中启动该模型表。

DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'projectInfo',
            'USER': 'root',
            'PASSWORD': '123@abc',
    
        },
        'movie': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'movieDB',
            'USER': 'root',
            'PASSWORD': '123@abc',
    
        }
    }

标签: djangodjango-modelsdjango-ormdjango-database

解决方案


您可以构建一个数据库路由器 [Django-doc]。这根据模型指定它应该路由到哪个数据库。例如,如果要在movie.Movie模型中路由movie模型,请使用:

class MyRouter:
    special_routing = {
        'movie.Movie': 'movie'
    }

    def db_for_read(self, model, **hints):
        return self.special_routing.get(model._meta.label)

    def db_for_write(self, model, **hints):
        return self.special_routing.get(model._meta.label)

    def allow_relation(self, obj1, obj2, **hints):
        return self.special_routing.get(obj1._model._meta.label) == self.special_routing.get(obj2._model._meta.label)

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return db == self.special_routing.get(f'{app_label}_{model_name}', 'default')

然后我们可以将它添加到DATABASE_ROUTERS设置 [Django-doc] 中

DATABASE_ROUTERS = ['path.to.MyRouter']

您可以编写更复杂的路由器,从而提示要写入的数据库。


推荐阅读