• Django--自定义 Command 命令


    Django 对于命令的添加有一套规范,你可以为每个app 指定命令。通俗一点讲,比如在使用manage.py文件执行命令的时候,可以自定制自己的命令,来实现命令的扩充。

    commands的创建

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

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

    python manage.py 命令名

    Django的Command命令是要放在一个app的management/commands目录下的。

     python2环境中,请确保management和management/commands目录内都包含__init__.py文件

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

    它必须定义一个Command类并扩展自BaseCommand或其 子类。

    其中help是command功能作用简介,handle函数是主处理程序,add_arguments函数是用来接收可选参数的

    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()
            # ...

     带参数的测试:

    # -*- coding: utf-8 -*-
    # __author__ = 'dandy'
    from django.core.management.base import BaseCommand
    
    class Command(BaseCommand):
    
        def add_arguments(self, parser):
            parser.add_argument('aaa', nargs='+', type=int)
            parser.add_argument('--delete',
                                action='store_true',
                                dest='delete',
                                default=False,
                                help='Delete poll instead of closing it')
    
        def handle(self, *args, **options):
            print('test')
            print(args, options)

    options里面直接取参数就可以了。

    方法

    返回django版本号:BaseCommand.get_version() 
    命令的真正逻辑。子类必须实现这个方法。:BaseCommand.handle()

    BaseCommand的子类

    class LabelCommand

    这个管理命令接收命令行上的一个或多个参数(标签),并对它们每一个都做一些动作。

    子类不用实现handle(),但必须实现handle_label(),它将会为每个标签调用一次。

    LabelCommand.handle_label(label, **options)

    对label完成命令行的动作,label是命令行给出的字符串。

  • 相关阅读:
    bzoj2431[HAOI2009]逆序对数列
    wikioi1082【线段树练习 3 】
    bzoj1715[Usaco2006 Dec]Wormholes 虫洞
    bzoj1676[Usaco2005 Feb]Feed Accounting 饲料计算
    bzoj1677[Usaco2005 Jan]Sumsets 求和
    bzoj1679[Usaco2005 Jan]Moo Volume 牛的呼声
    bzoj1680[Usaco2005 Mar]Yogurt factory
    bzoj1681[Usaco2005 Mar]Checking an Alibi 不在场的证明
    bzoj2705[SDOI2012]Longge的问题
    bzoj1627[Usaco2007 Dec]穿越泥地
  • 原文地址:https://www.cnblogs.com/polly-ling/p/9830060.html
Copyright © 2020-2023  润新知