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('命令执行出错'))
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
有任何问题请随时交流~
Email: araise1@163.com