Django的call_command失败,缺少必需的参数

zmb*_*mbq 5 python django argparse

我想从我的一个测试中调用Django管理命令.我正在使用django.core.management.call_command这个.它不起作用.

我有一个带有4个必需参数的命令.当我打电话给它时,即使我传递了它们,它也会抱怨所有参数都丢失了:

call_command('my_command', url='12', project='abc', website='zbb', title='12345')
Run Code Online (Sandbox Code Playgroud)

我得到基本命令错误 - 缺少--url, - project, - website和--title.

我没有为这些参数指定不同的目的地.

我查看了call_command源代码并将问题指向以下行call_command:

if command.use_argparse:
    # Use the `dest` option name from the parser option
    opt_mapping = {sorted(s_opt.option_strings)[0].lstrip('-').replace('-', '_'): s_opt.dest
                   for s_opt in parser._actions if s_opt.option_strings}
    arg_options = {opt_mapping.get(key, key): value for key, value in options.items()}
    defaults = parser.parse_args(args=args)    ****** THIS *****
    defaults = dict(defaults._get_kwargs(), **arg_options)
    # Move positional args out of options to mimic legacy optparse
    args = defaults.pop('args', ())
Run Code Online (Sandbox Code Playgroud)

args是传递给call_commands的位置参数,它是空的.我只传递命名参数.parser.parse_args抱怨缺少所需的变量.

这是在Django 1.8.3中.

这是我的命令的add_arguments函数(我刚刚删除了帮助字符串):

def add_arguments(self, parser):
    parser.add_argument('--url', action='store', required=True)
    parser.add_argument('--project', action='store', required=True)
    parser.add_argument('--continue-processing', action='store_true', default=False)
    parser.add_argument('--website', action='store', required=True)
    parser.add_argument('--title', action='store', required=True)
    parser.add_argument('--duplicate', action='store_true',default=False)
Run Code Online (Sandbox Code Playgroud)

hpa*_*ulj 3

根据您发布的那段代码,我得出的结论是call_command 参数是必需的

必需的命名参数必须通过 传入*args,而不仅仅是位置。

**kwargs绕过解析器。所以它看不到您在那里定义的任何内容。 **kwargs可以覆盖这些*args值,但*args每个必需参数仍然需要一些东西。如果您不想这样做,请关闭该required属性。

  • 是的,我也在 call_command 的代码中看到了这一点。这是 call_command 中的一个错误。我无法在 *args 中传递所需的参数 - 它们的正确顺序是什么?也许是我调用 add_argument 的顺序,也许是其他什么,也许取决于操作系统或 Python 版本。我不想冒险。 (2认同)