我一直在与这种恶化作斗争,但我在网上其他地方找不到确切的答案。
我有一个Django应用程序,它使用多个数据库;默认数据库,然后是客户端数据库db。默认数据库包含通用表。客户端数据库保存由使用我的应用程序的客户端创建的自定义数据/表。
我了解migrations
是如何工作的,但我使用的两个数据库在运行迁移时不应该包含相同的模型客户端应该有客户端表,默认的数据库应该保存通用数据。
同样重要的是要注意(因为下面的问题),我不制作特定于应用程序的模型(除了Django自己自动生成的默认模型),我为此使用了两个包/应用程序:objects
和objects_client
,objects
持有默认数据库模型,objects_client
持有clientdb模型。
client_db
也是我在设置中使用的名称。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
放在默认数据库中(我不希望)。
如何在排除应用程序(即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']