Django将特定模型的排除迁移到不同的数据库

时间:2019-01-07 15:36:49

标签: python django django-migrations

我一直在为这种加剧而苦苦挣扎,但在网上其他地方却找不到确切的答案。

我有一个使用多个数据库的Django应用; 默认数据库,然后是客户端数据库。 默认数据库保存通用表客户端数据库保存由使用我的应用程序的客户端创建的自定义数据/表

我了解migrations的工作方式,但是我使用的2个数据库在运行迁移时不应包含相同的模型。 客户端应具有客户端表,并且默认数据库应包含通用数据。

(由于下面的问题)需要注意的是,我没有创建特定于应用程序的模型(除了 Django 本身自动生成的默认模型之外),我使用了2个软件包/以下应用程序:objectsobjects_clientobjects保留默认数据库模型,objects_client保留客户端数据库模型。

client_db也是我在 settings.py

中使用的名称

现在这是我的问题:

我知道我可以运行python3 manage.py migrate objects_client --database=client_dbpython3 manage.py migrate objects --database=default,但是我不想单独指定 admin auth contenttypes sessions 迁移到默认数据库,因此我也运行python3 manage.py migrate,显然,objects_client也放置在默认数据库中(我不要)。

如何在不将应用程序中的每个模型都更改为 managed = false <的情况下,运行默认版本python3 manage.py migrate且不包含应用程序的objects_client命令。 / strong>(因为这很痛苦)?

如果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 :(得分:1)

使用Database routers设置数据库路由方案,并提供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']