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



我一直在与这种恶化作斗争,但我在网上其他地方找不到确切的答案。

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

我了解migrations是如何工作的,但我使用的两个数据库在运行迁移时不应该包含相同的模型客户端应该有客户端表,默认的数据库应该保存通用数据。

同样重要的是要注意(因为下面的问题),我不制作特定于应用程序的模型(除了Django自己自动生成的默认模型),我为此使用了两个包/应用程序:objectsobjects_clientobjects持有默认数据库模型,objects_client持有clientdb模型。

client_db也是我在设置中使用的名称。py

现在是我的问题:

我知道我可以运行python3 manage.py migrate objects_client --database=client_dbpython3 manage.py migrate objects --database=default,但我不想单独指定到默认数据库的adminauthcontenttypes会话迁移,所以我也运行python3 manage.py migrate,这显然也将objects_client放在默认数据库中(我不希望)。

如何在排除应用程序(即objects_client)的情况下运行默认python3 manage.py migrate命令的a版本,而不将该应用程序中的每个模型更改为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

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

最新更新