Python中Django的DATABASE_ROUTERS如何使用?

django 的文档里显示 DATABASE_ROUTERS = [‘path.to.AuthRouter’, ‘path.to.PrimaryReplicaRouter’]
DATABASE_ROUTERS 是一个列表里面有两个字符串
但是我想把它变成两个实例化后的 Router 实例请问怎么实现?
例如:

db_router = AuthRouter(db=“xxx”,db2=“xxxxx”)

DATABASE_ROUTERS = [ db_router ]
Python中Django的DATABASE_ROUTERS如何使用?


2 回复

在Django里,DATABASE_ROUTERS 是用来控制数据库读写路由的,主要用在多数据库配置的场景。你需要在 settings.py 里设置它,指向一个包含路由逻辑的类列表。

核心是创建一个路由类,里面定义几个关键方法。最常用的是 db_for_readdb_for_write

比如,你想把 User 模型的读写都指向 'users_db',其他模型用 'default',可以这么写:

# myapp/routers.py
class UserRouter:
    """
    一个简单的路由,将User模型的操作定向到特定数据库。
    """
    def db_for_read(self, model, **hints):
        if model._meta.model_name == 'user':
            return 'users_db'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.model_name == 'user':
            return 'users_db'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        # 允许User模型与其他任何模型建立关系
        if obj1._meta.model_name == 'user' or obj2._meta.model_name == 'user':
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        # 确保User模型只迁移到'users_db'
        if model_name == 'user':
            return db == 'users_db'
        # 其他模型不干预,返回None,由其他路由器或默认设置决定
        return None

然后在 settings.py 里配置:

DATABASE_ROUTERS = ['myapp.routers.UserRouter']

Django会按列表顺序询问每个路由器,第一个返回非 None 值的路由器决定使用哪个数据库。如果所有路由器都返回 None,则回退到 'default' 数据库。

简单说,就是写个类告诉Django不同模型该用哪个库。


就是你现在这种写法

回到顶部