自定义Django Command命令

来源:互联网 发布:苹果6激活应用与数据 编辑:程序博客网 时间:2024/05/17 15:57

前几天工作接触,顺便看了下文档。
首先,Django的Command命令是要放在一个app的management/commands目录下的。python2环境中,请确保management和management/commands目录内都包含__init__.py文件。
例如Command文件名为closepoll.py,对此模块只有唯一的要求,它必须定义一个Command类并扩展自BaseCommand或其 子类。
例:

from django.core.management.base import BaseCommand, CommandErrorfrom polls.models import Pollclass 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是命令行给出的字符串。

0 0
原创粉丝点击