我一直在为这种加剧而苦苦挣扎,但在网上其他地方却找不到确切的答案。
我有一个使用多个数据库的Django应用; 默认数据库,然后是客户端数据库。 默认数据库保存通用表。 客户端数据库保存由使用我的应用程序的客户端创建的自定义数据/表。
我了解migrations
的工作方式,但是我使用的2个数据库在运行迁移时不应包含相同的模型。 客户端应具有客户端表,并且默认数据库应包含通用数据。
(由于下面的问题)需要注意的是,我没有创建特定于应用程序的模型(除了 Django 本身自动生成的默认模型之外),我使用了2个软件包/以下应用程序:objects
和objects_client
,objects
保留默认数据库模型,objects_client
保留客户端数据库模型。
client_db
也是我在 settings.py
现在这是我的问题:
我知道我可以运行python3 manage.py migrate objects_client --database=client_db
和python3 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
答案 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']