Django测试中call_command为何不触发自定义参数解析器类型转换?
Django测试中call_command不触发自定义参数解析的原因及解决办法
当你用终端调用Django管理命令时,argparse会完整执行参数解析流程,包括你指定的type=custom_parser转换,所以options['tes']是relativedelta类型。但用call_command直接传关键字参数(比如tes='20s')时,Django会跳过argparse的解析步骤,直接把原始参数值传递给handle方法,所以参数还是字符串类型。
解决办法有三种:
1. 手动提前转换参数
在调用call_command时,先对参数执行自定义解析:
from dateutil.relativedelta import relativedelta from django.core.management import call_command def custom_parser(value): # 你的解析逻辑 return relativedelta(seconds=int(value[:-1])) call_command('mycommand', tes=custom_parser('20s'))
2. 使用argv参数模拟命令行调用
通过传递argv列表,让call_command走完整的argparse解析流程:
call_command('mycommand', argv=['--tes', '20s'])
或者更完整的写法:
call_command(argv=['mycommand', '--tes', '20s'])
3. 在管理命令的handle方法中兜底转换
如果希望不管是终端调用还是call_command调用都能自动转换,可以在handle里加一层判断:
def handle(self, *_args, **options): tes = options['tes'] if isinstance(tes, str): tes = custom_parser(tes) # 后续逻辑
这样无论参数是怎么传递的,都能保证tes是relativedelta类型。
内容的提问来源于stack exchange,提问作者E_K
相关产品推荐
相关产品推荐

