如何在Django中以编程方式执行django-tenants交互式命令?
解决Django中用
call_command执行tenant_command rebuild_index的问题 你遇到的错误是因为call_command的用法完全错了——它不需要你传入完整的python manage.py ...命令字符串,而是要拆分命令和参数来传递。我来给你讲正确的实现方式:
错误原因分析
你写的代码:
management.call_command('python manage.py tenant_command rebuild_index', 'xxx')
这里的问题在于:
call_command的第一个参数是命令的名称(比如tenant_command),不是整个终端命令行rebuild_index是tenant_command要执行的子命令,需要作为单独的参数传递- 租户schema和确认提示可以通过参数或模拟输入来处理,不需要硬塞在一个字符串里
正确实现方式(推荐非交互式)
大部分Django管理命令都支持非交互式参数,避免处理终端输入。对于tenant_command和rebuild_index,你可以直接指定schema和跳过确认:
from django.core import management # 直接指定租户schema,跳过y/n确认 management.call_command( 'tenant_command', 'rebuild_index', schema='xxx', # 指定租户schema,替代交互式输入 noinput=True # 跳过确认提示,直接执行 )
这个调用完全等价于你在终端执行的步骤:
- 运行
python manage.py tenant_command rebuild_index - 输入schema
xxx - 按回车确认(
noinput=True会自动确认)
如果你必须处理交互式输入
如果某些场景下不能用非交互式参数,可以通过模拟stdin来传入需要的输入内容:
import io from django.core import management # 准备输入:先输入schema,再输入回车(对应确认提示的默认选项) # 如果确认需要输入y,就写成 'xxx\ny\n' input_data = 'xxx\n' # 用StringIO模拟终端输入 with io.StringIO(input_data) as stdin: management.call_command( 'tenant_command', 'rebuild_index', stdin=stdin )
验证效果
不管用哪种方式,执行后都会和你手动在终端操作的结果一致,而且不会再出现Unknown command的错误。
内容的提问来源于stack exchange,提问作者giveJob
相关产品推荐
相关产品推荐

