GeoDjango с несколькими базами данных и маршрутизацией базы данных - PullRequest
0 голосов
/ 16 октября 2019

У меня есть две базы данных, одна база данных postgres, а другая база данных PostGIS. Затем параметры подключения определяются как:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': ENV('POSTGRES_DB'),
        'USER': ENV('POSTGRES_USER'),
        'PASSWORD': ENV('POSTGRES_PASSWORD'),
        'HOST': ENV('POSTGRES_HOST', default='localhost'),
        'PORT': ENV('POSTGRES_PORT', default='5432'),
    }
}

DATABASES['gis'] = {
    'ENGINE': 'django.contrib.gis.db.backends.postgis',
    'NAME': ENV('POSTGIS_DB'),
    'USER': ENV('POSTGIS_USER'),
    'PASSWORD': ENV('POSTGIS_PASSWORD'),
    'HOST': ENV('POSTGIS_HOST', default='postgis'),
    'PORT': ENV('POSTGIS_PORT', default='5432'),
}

У меня также есть два приложения, одно из которых я хочу использовать базу данных PostGIS (называемой study_gis, а другое - базу данных по умолчанию. Поэтому янастроить маршрутизатор базы данных (dbRouter.py):

class StudyGISDBRouter(object):
    """
    A router to control gis db operations
    """
    def db_for_read(self, model, **hints):
        "Point all operations on study_gis models to 'gis'"
        from django.conf import settings
        if 'gis' not in settings.DATABASES:
            return None
        if model._meta.app_label == 'study_gis':
            return 'gis'
        return None

    def db_for_write(self, model, **hints):
        "Point all operations on study_gis models to 'gis'"
        from django.conf import settings
        if 'gis' not in settings.DATABASES:
            return None
        if model._meta.app_label == 'study_gis':
            return 'gis'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        "Allow any relation if a model in study_gis is involved"
        from django.conf import settings
        if 'gis' not in settings.DATABASES:
            return None
        if obj1._meta.app_label == 'study_gis' or obj2._meta.app_label == 'study_gis':
            return True
        return None

    def allow_syncdb(self, db, model):
        "Make sure the study_gis app only appears on the 'gis' db"
        from django.conf import settings
        if 'gis' not in settings.DATABASES:
            return None
        if db == 'gis':
            return model._meta.app_label == 'study_gis'
        elif model._meta.app_label == 'study_gis':
            return False
        return None

Затем я устанавливаю маршрутизатор в моем файле настроек:

DATABASE_ROUTERS = [
    'study_gis.dbRouter.StudyGISDBRouter'
]

Проблема:

Как толькоЯ пытаюсь выполнить миграцию и получаю следующую ошибку:

AttributeError: 'DatabaseOperations' object has no attribute 'geo_db_type'

Из других сообщений, в которых есть похожие ошибки, обычно ответ заключается в том, чтобы убедиться, что движок использует серверную часть postgis. Но так как у меня есть это вgis настройки базы данных, я не понимаю, что является причиной проблемы.

Как я могу убедиться, что одно приложение использует правильную базу данных, помимо того, что у меня уже есть в маршрутизаторе?

...