Django command

这一篇临时写的,作用是记录,还没有细化和整理,可能看起来比较乱,有时间了再整理优化

今天要基于Django写一个脚本,command实现比较容易,而且还能用到Django本身的ORM挺方便的,所以就决定用command, 一下午下来,脚本写完了,感觉也遇到了不少的坑,所以这里总结一下。

commands的创建

1、在app内创建一个management的python目录
2、在management目录里面创建commands的python文件夹
3、在commands文件夹下创建任意py文件

此时py文件名就是你的自定制命令,可以使用下面方式执行

python manage.py 命令名

command对于文件名没什么要求,但文件内部需要定义一个Command类并继承BaseCommand类或其子类

这样最基本的命令就写好了

调用直接用上面的python manage.py 命令名调用就好

这都没啥讲的,我遇到的坑是加入参数,也就是add_argument() 的使用方法

首先下面是这个方法的参数列表

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
  • name or flags - 选项字符串的名字或者列表,例如 foo 或者 -f, --foo。
  • action - 命令行遇到参数时的动作,默认值是 store。
    • store_const,表示赋值为const;
    • append,将遇到的值存储成列表,也就是如果参数重复则会保存多个值;
    • append_const,将参数规范中定义的一个值保存到一个列表;
    • count,存储遇到的次数;此外,也可以继承 argparse.Action 自定义参数解析;
  • nargs - 应该读取的命令行参数个数,可以是具体的数字,或者是?号,当不指定值时对于 Positional argument 使用 default,对于 Optional argument 使用 const;或者是 * 号,表示 0 或多个参数;或者是 + 号表示 1 或多个参数。
  • const - action 和 nargs 所需要的常量值。
  • default - 不指定参数时的默认值。
  • type - 命令行参数应该被转换成的类型。
  • choices - 参数可允许的值的一个容器。
  • required - 可选参数是否可以省略 (仅针对可选参数)。
  • help - 参数的帮助信息,当指定为 argparse.SUPPRESS 时表示不显示该参数的帮助信息.
  • metavar - 在 usage 说明中的参数名称,对于必选参数默认就是参数名称,对于可选参数默认是全大写的参数名称.
  • dest - 解析后的参数名称,默认情况下,对于可选参数选取最长的名称,中划线转换为下划线.

parser.add_argument(),里面的参数,如果有–,表示是可选参数,没有–的话,意味着是必选参数,在运行时必须输入,default是没有用的。

parser.add_argument('--date',
                    nargs='?',
                    default='all',
                    type=str,
                    required=False,
                    help='Select data date args please input week or all '

加--的同时,nargs的值也需要相应更改,否则也会报错,这点要注意下

可选参数用法,以上面的设置为例

python manage.py command111 --date=week

不能直接跟week,需要加个--date

整体命令格式
class Command(BaseCommand):

    def add_arguments(self, parser):

        parser.add_argument(
            '-n',
            '--name',
            action='store',
            dest='name',
            default='close',
            help='name of author.',
        )

    def handle(self, *args, **options):
        try:
            if options['name']:
                print('hello world, %s' % options['name'])
            self.stdout.write(self.style.SUCCESS('命令%s执行成功, 参数为%s' % (__file__, options['name'])))
        except Exception as e:
            self.stdout.write(self.style.ERROR('命令执行出错'))

posted @ 2021-06-15 17:45  seas  阅读(397)  评论(0编辑  收藏  举报