【Python3.13】Django5.1项目之多数据源路由器配置

博主在使用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应用中的数据表:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值