Django Migrate Исключение определенных моделей для разных баз данных - PullRequest
0 голосов
/ 07 января 2019

Я немного боролся с этим обострением, и я не смог найти окончательного ответа в другом месте онлайн.

У меня есть приложение Django, которое использует несколько баз данных; по умолчанию дБ, а затем клиент дБ. по умолчанию db содержит универсальных таблиц . client db содержит пользовательских данных / таблиц, созданных клиентом, использующим мое приложение .

Я понимаю, как работает migrations, но я использую 2 базы данных, которые не должны включать те же модели, что и при выполнении миграции. client должен иметь клиентские таблицы, а default db должен содержать универсальные данные.

Также важно отметить (из-за нижеприведенного вопроса), что я не делаю специфичные для приложения модели (кроме стандартных, автоматически сгенерированных самой Django ), я использую 2 пакета / приложения для этого: objects и objects_client, objects содержит модели по умолчанию db, а objects_client - модели client db.

client_db это также имя, которое я использую в settings.py

Теперь вот моя проблема:

Я знаю, что могу запускать python3 manage.py migrate objects_client --database=client_db и python3 manage.py migrate objects --database=default, но я не хочу отдельно указывать admin , auth , contenttypes и сеансы переносятся в базу данных по умолчанию, поэтому я также запускаю python3 manage.py migrate, что, очевидно, также помещает objects_client в базу данных по умолчанию (что мне не нужно).

Как мне запустить версию команды по умолчанию python3 manage.py migrate с исключением приложения, т.е. objects_client, без изменения каждой модели в этом приложении на managed = false (потому что это боль)?

Вот вывод showmigrations, если он поможет более подробно описать то, что я имею в виду, это переносимые приложения.

admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
 [X] 0003_logentry_add_action_flag_choices
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
 [X] 0009_alter_user_last_name_max_length
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
objects
 [X] 0001_initial
objects_client
 [X] 0001_initial
sessions
 [X] 0001_initial

1 Ответ

0 голосов
/ 07 января 2019

Настройте схему маршрутизации базы данных с помощью Маршрутизаторы базы данных и предоставьте метод allow_migrate, чтобы определить, разрешено ли выполнение операции миграции в базе данных с псевдонимом db.

class Router:
    ...
    def allow_migrate(self, db, app_label, model_name=None, **hints):
        """
        Make sure the objects_client app only appears in the 'client_db'
        database.
        """
        if app_label == 'objects_client':
            return db == 'client_db'
        return None

Наконец, в файле settings.py добавьте следующий

DATABASE_ROUTERS = ['path.to.Router']
...