django自定义管理命令(如初始化数据库)

django自定义管理命令

用过 Django 的朋友应该最熟悉这三个命令:

python manage.py runserver
python manage.py makemigrations
python manage.py migrate
非常方便,不是吗?那其实,我们也可以自定义这样的命令,来提高我们的开发效率。

今天就来分享如何在 Django 中创建自定义的管理命令。

和 Django 的模版 template 一样,自定义的命令也遵循一定的路径格式。
应用可以通过manage.py注册它们自己的动作。例如,你可能想为你正在发布的Django应用添加一个manage.py动作。在本页文档中,我们将为教程中的 polls应用构建一个自定义的 closepoll命令。

要做到这点,只需向该应用添加一个management/commands目录。Django将为该目录中名字没有以下划线开始的每个Python模块注册一个manage.py命令。例如:
polls/
    __init__.py
    models.py
    management/
        __init__.py
        commands/
            __init__.py
            _private.py
            closepoll.py
    tests.py
    views.py
'''
	在app下创建management/commands/ 两个包
'''
请注意,上述路径中的 _private.py 不会生效。polls 需要在 settings.py 中的 INSTALLED_APPS 中注册,python manage.py closepoll 才会生效。

接下来说下 closepoll 这个文件的格式。

对 closepoll.py 模块只有一个要求,那就是必须定义 Command 类,该类继承自 BaseCommand 或其子类。

比如像这样:
	from django.core.management.base import BaseCommand, CommandError
    class Command(BaseCommand):
        help = 'Closes the specified poll for voting'

        def add_arguments(self, parser):
            parser.add_argument('poll_ids', nargs='+', type=int)  # 写了就必须传参数
            # 传第二个
            # parser.add_argument('id', nargs='+', type=int)

        def handle(self, *args, **options):
            for poll_id in options['poll_ids']:
                print(f"closing {poll_id} done.")
                #do something here

                self.stdout.write(self.style.SUCCESS('Successfully closed poll "%s"' % poll_id))
要实现这个命令,需将polls/management/commands/closepoll.py编辑成这样:
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)
            
  '''
	在cmd中输入  python3 manage.py closepoll 时会执行 handle函数中的代码
        python3 manage.py 需要执行的py文件名
  '''
  '''
  	注:
  		当你使用管理命令并希望提供控制台输出时,你应该写到self.stdout和self.stderr,而不能直接打印到 stdout和stderr。通过使用这些代理方法,测试你自定		义的命令将变得非常容易。还请注意,你不需要在消息的末尾加上一个换行符,它将被自动添加,除非你指定ending参数:

		self.stdout.write("Unterminated line", ending='')
  '''

接收可选参数

在add_arguments方法中添加参数
def add_arguments(self, parser):
        # Positional arguments
        parser.add_argument('poll_ids', nargs='+', type=int)
 
        # Named (optional) arguments
        parser.add_argument(
            '--delete',
            action='store_true',
            help='Delete poll instead of closing it',
        )

python3 manage.py closepoll 1 2 3 --delete 1
'''
	add_argument方法参数,参考https://blog.csdn.net/weixin_45388452/article/details/125401449
'''
posted @ 2022-10-20 11:40  春游去动物园  阅读(124)  评论(0编辑  收藏  举报