前几天工作接触,顺便看了下文档。
首先,Django的Command命令是要放在一个app的management/commands目录下的。python2环境中,请确保management和management/commands目录内都包含__init__.py
文件。
例如Command文件名为closepoll.py,对此模块只有唯一的要求,它必须定义一个Command类并扩展自BaseCommand或其 子类。
例:
from django.core.management.base import BaseCommand, CommandError
from polls.models import Poll
class Command(BaseCommand):
help = 'Closes the specified poll for voting'
def add_arguments(self, parser):
parser.add_argument('poll_id', nargs='+', type=int)
def handle(self, *args, **options):
for poll_id in options['poll_id']:
try:
poll = Poll.objects.get(pk=poll_id)
except Poll.DoesNotExist:
raise CommandError('Poll "%s" does not exist' % poll_id)
poll.opened = False
poll.save()
self.stdout.write('Successfully closed poll "%s"' % poll_id)
接收可选参数
可使用add_argument()方法:
class Command(BaseCommand):
def add_arguments(self, parser):
# Positional arguments
parser.add_argument('poll_id', nargs='+', type=int)
# Named (optional) arguments
parser.add_argument('--delete',
action='store_true',
dest='delete',
default=False,
help='Delete poll instead of closing it')
def handle(self, *args, **options):
# ...
if options['delete']:
poll.delete()
# ...
方法
返回django版本号:BaseCommand.get_version()
命令的真正逻辑。子类必须实现这个方法。:BaseCommand.handle()
BaseCommand的子类
class LabelCommand
这个管理命令接收命令行上的一个或多个参数(标签),并对它们每一个都做一些动作。
子类不用实现handle()
,但必须实现handle_label()
,它将会为每个标签调用一次。
LabelCommand.handle_label(label, **options)
对label完成命令行的动作,label是命令行给出的字符串。