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_read 和 db_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不同模型该用哪个库。
就是你现在这种写法

