1

私はこれに対する解決策を探しましたが、何も見つかりませんでした。

1 つの Django プロジェクト、1 つのアプリケーション、2 つのモデル、2 つのデータベースがあります。1 つのモデルが 1 つのデータベースに対して排他的に話し、同期することを希望します。これは私が試したことです:

設定

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']

モデル

from django.db import models

class TestModelA(models.Model):
    testid = models.CharField(max_length=200)
    class Meta:
        db_table = 'test_model_a'

class TestModelB(models.Model):
    testid = models.CharField(max_length=200)
    class Meta:
        db_table = 'test_model_b'
        app_label = 'application_b'

ルーター

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」です。基本的にこのセットアップでは、データベースを同期すると、デフォルトのデータベースでのみ同期されます。2 番目のデータベースを指定してデータベースを同期すると、2 番目のデータベースpython manage.py syncdb --database=applicationb_dbには何も同期されません。

私は単に次のことを達成しようとしています:

  • TestModelA のすべてがデフォルト データベースに移動します
  • TestModelB のすべてが applicationb_db データベースに移動します
  • それ以外はすべてデフォルトのデータベースに移動します
4

1 に答える 1

3

を使用する代わりに、それがどのモデルであるかを確認し、適切な DB を返すためにmodel._meta.app_label使用できます。model

ルーターは次のように更新できます。

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
于 2013-11-11T15:52:25.500 に答える