我想在django中放一个脚本,然后循环执行他,该脚本会操作数据库,我懒得自己pymysql等方式写,就想用orm的方式,直接脚本中import models,但是呢,python xxxx执行后各种报错,说找不到环境变量,网上搜了下解决方案,也是差不多,但我就是没有调试出来。于是打算用django自带的方式执行命令。
目录结构
在app中创建/management/commands目录
在commands目录里面创建py脚本
例如我的app叫做gp_volume,则在这个路径下创建/management/commands,然后放了两个脚本,一个是page_manager.py,一个是test.py。
1 2 3 4 5 6 7 8 9 10 11 12 . |-- admin.py |-- apps.py |-- __init__.py |-- management | `-- commands | |-- page_manager.py | |-- __pycache__ | | |-- page_manager.cpython-36.pyc | | `-- test.cpython-36.pyc | `-- test.py
脚本编写
脚本代码需要封装在Command这个类里面,且继承BaseCommand类
对Command类的handle函数进行重写
拿个page_manager.py举例
1 2 3 4 5 6 7 8 9 10 11 12 13 from django.core.management.base import BaseCommand, CommandErrorfrom gp_volume.models import Code, Volume, Pageimport datetimeclass Command (BaseCommand ): def handle (self, *args, **options ): code_list = Code.objects.filter (status='o' , date=str (datetime.date.today())) for code in code_list: print(code.code)
脚本执行
python3 manage.py ${script_name}
例如跑page_manager.py,无需脚本后缀名
1 python3 manager page_manager
传参给脚本
定义add_arguments方法
使用options[‘key’]获取传入的参数
test.py例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 from django.core.management.base import BaseCommand, CommandErrorfrom gp_volume.models import Code, Volume, Pageimport datetimeclass Command (BaseCommand ): def add_arguments (self, parser ): parser.add_argument('code_id' , nargs='+' , type =str ) parser.add_argument( '--delete' , action='store_True' , help ='Delete poll instead of closing it' , ) def handle (self, *args, **options ): if options['delete' ]: for code in options['code_id' ]: Code.objects.get(code=code).delete() else : print('no args' )
执行命令
1 python3 manage.py test --delete xxxxxxx
refer
https://docs.djangoproject.com/en/2.2/howto/custom-management-commands/