在django中处理命令参数

时间:2018-03-30 17:52:48

标签: python django

我正在尝试为我的django命令添加一些参数。 我的命令将执行一个SQL查询,我想 有一个可选参数--first_row和if --first_row 指定用户必须指定第二个段--last_row。

以下是我的尝试:

from django.core.management.base import BaseCommand, CommandError
import time

class Command(BaseCommand):
    def add_arguments(self, parser):
        parser.add_argument('--first_row', type=int)
        parser.add_argument('--last_row', type=int)

    def handle(self, *args, **options):
        import argparse
        parser = argparse.ArgumentParser()
        self.add_arguments(parser)

        start = time.time()
        args = parser.parse_args()
        if args.first_row:
            print "first row is %d" % (args.first_row)
        end = time.time()
        self.stdout.write(self.style.SUCCESS("Operation took %d seconds" % (end-start)))

但是当我运行我的命令时,我得到了这个输出:

manage.py > query_db --first_row 1 --last_row 5
usage: manage.py [-h] [--first_row FIRST_ROW] [--last_row LAST_ROW]
manage.py: error: unrecognized arguments: query_db

Process finished with exit code 2

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您不应在ArgumentParser方法中实例化新的handle。它不知道query_db参数,因此您得到unrecognized arguments: query_db错误。

关于如何在this question处理相互包容的论点,有一些建议。如果first_row中存在optionslast_row不存在,则可以使用第一个建议并引发错误:

from django.core.management import CommandError

def add_arguments(self, parser):
    parser.add_argument('--first_row', type=int)
    parser.add_argument('--last_row', type=int)

def handle(self, *args, **options):
    if options['first_row'] is not None and options['last_row'] is None:
        raise CommandError("--last_row is required when --first_row is specified)
    ...