多个Django数据库 - 将模型映射到同一应用程序中的数据库

2024-09-30 12:20:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我到处寻找解决这个问题的办法,但什么也没找到。在

我有一个Django项目,一个应用程序,两个模型和两个数据库。我想一个模型发言和独家同步到一个数据库。这就是我尝试过的:

设置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'database_a',                      # Or path to database file if using sqlite3.
        # The following settings are not used with sqlite3:
        'USER': 'user',
        'PASSWORD': 'xxxxxx',
        'HOST': 'localhost',                      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': '',                      # Set to empty string for default.
    },
    'applicationb_db': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'database_b',
        'USER': 'user',
        'PASSWORD': 'xxxxxx',
        'HOST': 'localhost',
        'PORT': '',                 
    },
}
DATABASE_ROUTERS = ['fanmode4.router.ApiRouter']

型号

^{pr2}$

路由器

class ApiRouter(object):
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'application_b':
            return 'applicationb_db'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'application_b':
            return 'applicationb_db'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if obj1._meta.app_label == 'application_b' or \
           obj2._meta.app_label == 'application_b':
           return True
        return None

    def allow_syncdb(self, db, model):
        if db == 'applicationb_db':
            return model._meta.app_label == 'application_b'
        elif model._meta.app_label == 'application_b':
            return False
        return None

应用程序名为“api”。基本上有了这个设置,如果我同步数据库,它将只在默认数据库上同步。如果我同步指定第二个数据库python manage.py syncdb --database=applicationb_db的数据库,它不会将任何内容同步到第二个数据库。在

我只是想实现以下目标:

  • TestModelA的所有内容都转到默认数据库
  • TestModelB的所有内容都将转到applicationb\u db数据库
  • 其他所有内容都将转到默认数据库

Tags: self数据库applocalhostfordbmodelreturn
1条回答
网友
1楼 · 发布于 2024-09-30 12:20:36

您可以使用model._meta.app_label来检查它是哪个模型并返回适当的DB,而不是使用model._meta.app_label。在

您可以将路由器更新为:

class ApiRouter(object):
    def db_for_read(self, model, **hints):
        if model == TestModelB:
            return 'applicationb_db'
        return None

    def db_for_write(self, model, **hints):
        if model == TestModelB:
            return 'applicationb_db'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if model == TestModelB:
           return True
        return None

    def allow_syncdb(self, db, model):
        if model == TestModelB:
            return True
        else:
            return False
        return None

相关问题 更多 >

    热门问题