将日期字符串传递给 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_date
s等:
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_date
和end_date
将是列表个字符串,不是单个字符串,所以需要进行映射。
我有一个 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_date
s等:
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_date
和end_date
将是列表个字符串,不是单个字符串,所以需要进行映射。