将日期字符串传递给 Django 管理参数

Passing in date string to Django management argument

我有一个 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

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

argument 1 must be str, not 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___

感谢任何帮助

*** 编辑:

我应该解释一下,我已经在引号中传递了字符串,但它仍然 returns 同样的错误。

这是因为space被视为参数分隔符。您可以将参数包装在 single/double 引号上,因此 --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 <b>'2020-11-30 00:00:00'</b> --end_date <b>'2020-12-06 23:59:00'</b> --schema=schema_name
#                                      pass the datetimes as a <i>single</i> parameter ↑                                ↑

这是因为space被视为参数分隔符。您可以将参数包装在 single/double 引号上,因此 --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 <b>'2020-11-30 00:00:00'</b> --end_date <b>'2020-12-06 23:59:00'</b> --schema=schema_name
#                                      pass the datetimes as a <i>single</i> parameter ↑                                ↑

此外,您误解了参数的处理方式。这是 没有 双连字符。因此,您可以使用 options.get('start_date'),但最好只使用参数的名称,并删除 nargs='+',因为这意味着可以通过 multiple --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<b>, start_date, end_date</b>, **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将是列表个字符串,不是单个字符串,所以需要进行映射。