Django Маршрутизаторы базы данных не перенаправляют к правильной базе данных - PullRequest
0 голосов
/ 12 апреля 2020

Я пишу панель инструментов для поддержки различных приложений. Поэтому я хочу иметь доступ к отдельным базам данных на сервере.

Последний шаг, чтобы все это заработало, - это настройка маршрутизации базы данных. Однако в итоге я получаю все таблицы в базе данных по умолчанию, а в базе данных приложения для моего приложения-тура нет ни одной.

settings.py

DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.mysql',
        'ENGINE': 'django.contrib.gis.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': os.path.join(CONFIG_DIR, 'apps.cnf'),
        },
    },
    'morapps': {
        #'ENGINE': 'django.db.backends.mysql',
        'ENGINE': 'django.contrib.gis.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': os.path.join(CONFIG_DIR,'apps.cnf'),
        },
    },
    'tourdb': {
        #'ENGINE': 'django.db.backends.mysql',
        'ENGINE': 'django.contrib.gis.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': os.path.join(CONFIG_DIR,'tourdb.cnf'),
        },
    }
}

DATABASE_ROUTERS = ['dbrouter.DbRouter']

DATABASE_APPS_MAPPING = {'contenttypes': 'default',
                     'auth': 'default',
                     'admin': 'default',
                     'sessions': 'default',
                     'messages': 'default',
                     'staticfiles': 'default',
                     'tour_admin': 'tourdb',
                     }

dbRouter.py

class DbRouter(object):
    def db_for_read(self, model, **hints):
        "Point all operations on tour_admin models to 'tourdb'"
        print("1 label: "+model._meta.app_label)
        if model._meta.app_label == 'tour_admin':
            print("test1")
            return 'tourdb'
        return 'default'

    def db_for_write(self, model, **hints):
        "Point all operations on tour_admin models to 'tourdb'"
        print("2 label: " +model._meta.app_label)
        if model._meta.app_label == 'tour_admin':
            print("test2")
            return 'tourdb'
        return 'default'

    def allow_relation(self, obj1, obj2, **hints):
        "Allow any relation if a both models in tour_admin app"
        print("3 label: " +obj1._meta.app_label+"|"+obj2._meta.app_label)
        if obj1._meta.app_label == 'tour_admin' and obj2._meta.app_label == 'tour_admin':
            print("test3")
            return True
        # Allow if neither is tour_admin app
        elif 'tour_admin' not in [obj1._meta.app_label, obj2._meta.app_label]:
            print("test4")
            return True
        return False

    def allow_syncdb(self, db, model):
        print("4 label: " + db+"|"+model._meta.app_label )
        if db == 'tourdb' or model._meta.app_label == "tour_admin":
            print("test5")
            return False  # we're not using syncdb on our legacy database
        else:  # but all other models/databases are fine
            print("test6")
            return True

Как вы можете видеть, я поместил операторы print в код для отладки, и похоже, что единственные метки приложения, которые я получаю, это auth и contenttypes.

Есть идеи у кого-нибудь?

...