Django admin管理多个数据库

本文详细介绍如何在Django项目中配置和使用多个数据库,包括设置数据库路由规则,确保不同应用的数据存储在指定的数据库中,以及如何生成并迁移数据库模型。

前言

Djangoadmin 是一个 Django 自带的后台管理工具=,以往都是多个应用使用一个数据库,现在需要连接多个数据库,所以以前的套路就不行了。

1.配置setting.py

DATABASES = {
    'default': {   # 第一个一定要写default
        'ENGINE': 'django.db.backends.mysql',
        'NAME': "db_name",
        'USER': "root",
        'PASSWORD': "xxxxxxxx",
        'HOST': "xxxxxxxx"
    },
    'name_2': {  # 配置第二个数据库节点名称
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name2',  # 第二个数据库的名称
        'USER': 'root',
        'PASSWORD': 'xxxxxxxx',
        'HOST': 'xxxxxxxx',
    }
}


DATABASE_ROUTERS = ['project_name.database_router.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {
     'app_name1': 'default',
     'app_name2': 'name_2',
}

2. 创建数据库路由规则

在项目工程根路径下(与 settings.py 文件一级)创建 database_router.py 文件:

from django.conf import settings

DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING


class DatabaseAppsRouter(object):
    """
    A router to control all database operations on models for different
    databases.

    In case an app is not set in settings.DATABASE_APPS_MAPPING, the router
    will fallback to the `default` database.

    Settings example:

    DATABASE_APPS_MAPPING = {'app1': 'db1', 'app2': 'db2'}
    """

    def db_for_read(self, model, **hints):
        """"Point all read operations to the specific database."""
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def db_for_write(self, model, **hints):
        """Point all write operations to the specific database."""
        if model._meta.app_label in DATABASE_MAPPING:
            return DATABASE_MAPPING[model._meta.app_label]
        return None

    def allow_relation(self, obj1, obj2, **hints):
        """Allow any relation between apps that use the same database."""
        db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
        db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
        if db_obj1 and db_obj2:
            if db_obj1 == db_obj2:
                return True
            else:
                return False
        return None

    def allow_syncdb(self, db, model):
        """Make sure that apps only appear in the related database."""

        if db in DATABASE_MAPPING.values():
            return DATABASE_MAPPING.get(model._meta.app_label) == db
        elif model._meta.app_label in DATABASE_MAPPING:
            return False
        return None

    def allow_migrate(self, db, app_label, model=None, **hints):
        """
        Make sure the auth app only appears in the 'auth_db'
        database.
        """
        if db in DATABASE_MAPPING.values():
            return DATABASE_MAPPING.get(app_label) == db
        elif app_label in DATABASE_MAPPING:
            return False
        return None

小知识

python manage.py inspectdb --database=db_name2,这条命令可以生成 db_name2 数据库的模型,把模型导入到该app下的 models.py 然后再顺序执行
python manage.py makemigrationspython manage.py migrate 两条指令即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值