博主在使用django5.1版本搭建项目时,发现model中的meta选项不再支持db_alias配置模型使用的数据源,具体可参考django官方文档:Model Meta options | Django documentation | Django,故试验了一把数据库路由的方式来配置不同应用不同数据源的操作。
在Django项目中配置多个数据源通常意味着你需要连接到多个数据库。以下是如何在Django中设置多个数据源的步骤:
步骤一:配置数据库列表。
在Django项目的settings.py文件中配置数据库列表,本文以多mysql数据源为例说明:
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "xxx",
'USER': 'xxx',
'PASSWORD': 'xxx',
'HOST': 'xxx',
'PORT': '3306',
},
'cdp_mysql': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "xxx",
'USER': 'xxx',
'PASSWORD': 'xxx',
'HOST': 'xxx',
'PORT': '3306',
},
"db_sqlite3": {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'sqlite3',
}
# 可以添加更多数据库配置
}
步骤二:配置数据源model
本处主要是配置cdp_mysql数据源的model:
在models.py中添加model:
from django.db import models
# Create your models here.
class Config(models.Model):
id = models.BigAutoField(primary_key=True, verbose_name='ID')
name = models.CharField(max_length=64, verbose_name='名称')
class Meta:
#db_table替换为自己的数据库表
db_table = 'xxx'
managed = False
verbose_name = '配置表'
在admin.py中设置要显示的字段:
from django.contrib import admin
# Register your models here.
from .models import Config
class ConfigAdmin(admin.ModelAdmin):
list_display = ('id', 'name')
search_fields = ('id', 'name')
admin.site.register(Config, ConfigAdmin)
在settings.py中将新建的cdp应用加入:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'index',
'cdp',
]
步骤三:自定义数据库路由类
在不同的应用中定义专属的路由类,位置及名称如下:
class Router:
"""
一个路由器,用于将 dataCenterWeb 的数据库操作路由到 default。
"""
def db_for_read(self, model, **hints):
"""
尝试将读操作路由到 default。
"""
if model._meta.app_label == 'dataCenterWeb':
return 'default'
return None
def db_for_write(self, model, **hints):
"""
尝试将写操作路由到 default。
"""
if model._meta.app_label == 'dataCenterWeb':
return 'default'
return None
def allow_relation(self, obj1, obj2, **hints):
"""
确保 dataCenterWeb 中的模型之间可以建立关系。
"""
if obj1._meta.app_label == 'dataCenterWeb' and obj2._meta.app_label == 'dataCenterWeb':
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
确保 dataCenterWeb 的迁移操作只应用到 default。
"""
if app_label == 'dataCenterWeb':
return db == 'default'
return None
新建一个应用cdp:
同样创建一个路由类router.py,位置及内容如下:
class Router:
"""
一个路由器,用于将 cdp 的数据库操作路由到 cdp_mysql。
"""
def db_for_read(self, model, **hints):
"""
尝试将读操作路由到 cdp_mysql。
"""
if model._meta.app_label == 'cdp':
return 'cdp_mysql'
return None
def db_for_write(self, model, **hints):
"""
尝试将写操作路由到 cdp_mysql。
"""
if model._meta.app_label == 'cdp':
return 'cdp_mysql'
return None
def allow_relation(self, obj1, obj2, **hints):
"""
确保 cdp 中的模型之间可以建立关系。
"""
if obj1._meta.app_label == 'cdp' and obj2._meta.app_label == 'cdp':
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
确保 cdp 的迁移操作只应用到 cdp_mysql。
"""
if app_label == 'cdp':
return db == 'cdp_mysql'
return None
# 在 settings.py 中设置 DATABASE_ROUTERS = ['dataCenterWeb.router.Router', 'cdp.router.Router']
💡注意:dataCenterWeb.router为示例中路由的地址,需要更换为自己项目的实际地址
登录django管理后台,可以正常管理CDP应用中的数据表: