3

我有一个 Django 管理命令,我这样传递:

python manage.py tenant_command generate_weekly_invoice --start_date 2020-11-30 00:00:00 --end_date 2020-12-06 23:59:00 --schema=schema_name

这不起作用,我收到一条错误消息:

参数 1 必须是 str,而不是 None

我怀疑这与日期的实际字符串的2020-11-30 00:00:00格式化方式有关。我的管理命令代码如下

generate_weekly_invoice.py

class Command(BaseCommand):
    help = 'Generates weekly invoice'

    def add_arguments(self, parser):
        parser.add_argument('--start_date', nargs='+')
        parser.add_argument('--end_date', nargs='+')
    
    def handle(self, *args, **options):

        start_str = options.get('--start_date')
        end_str = options.get('--end_date')

        start_date = datetime.datetime.strptime(start_str, '%Y-%m-%d %H:%M:%S')
        end_date = datetime.datetime.strptime(end_str, '%Y-%m-%d %H:%M:%S')

        ___Logic goes here___

任何帮助表示赞赏

*** 编辑:

我应该解释一下,我已经用引号传递了字符串,但它仍然返回相同的错误。

4

1 回答 1

3

这是因为空格被视为参数分隔符。您可以将参数包装在单引号/双引号上,因此可以--start_date '2020-11-30 00:00:00'代替--start_date 2020-12-06 23:59:00

python manage.py tenant_command generate_weekly_invoice --start_date '2020-11-30 00:00:00' --end_date '2020-12-06 23:59:00' --schema=schema_name
#                                      pass the datetimes as a single parameter ↑                                ↑

这是因为空格被视为参数分隔符。您可以将参数包装在单引号/双引号上,因此可以--start_date '2020-11-30 00:00:00'代替--start_date 2020-12-06 23:59:00

python manage.py tenant_command generate_weekly_invoice --start_date '2020-11-30 00:00:00' --end_date '2020-12-06 23:59:00' --schema=schema_name
#                                      pass the datetimes as a single parameter ↑                                ↑

此外,您误解了如何处理参数。这没有双连字符。因此,您可以使用options.get('start_date'),但最好简单地使用参数的名称,并删除nargs='+',因为这意味着一个可以传递多个 --start_dates 等:

class Command(BaseCommand):
    help = 'Generates weekly invoice'

    def add_arguments(self, parser):
        parser.add_argument('--start_date')  # ← no nargs='+'
        parser.add_argument('--end_date')    # ← no nargs='+'
    
    def handle(self, start_date, end_date, **kwargs):
        start_date = datetime.datetime.strptime(start_date, '%Y-%m-%d %H:%M:%S')
        end_date = datetime.datetime.strptime(end_date, '%Y-%m-%d %H:%M:%S')

如果你想解析--start_date多次,那么你可以使用nargs='+', 但然后start_dateend_date将是字符串列表,而不是单个字符串,所以你需要执行映射。

于 2020-12-04T11:42:49.750 回答