Программы
Пример своей консольной команды в Django проекте

Пример своей консольной команды в Django проекте

Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать свои команды для управления проектом.

Для того, чтобы добавить команду в Django проект надо его определить в одном из подключённых проектов. Для этого в одном из создадим подмодуль management/commands и определить там модуль с командой. Например, мы хотим создать команду для генерации текста для предпросмотра заметки (приложение post):

post
└───management
    │   __init__.py
    │
    └───commands
            gen_preview.py
            __init__.py

Файлы __init__.py оставляем пустыми, а в gen_preview.py описываем команду:

from django.core.management.base import BaseCommand
from post.models import Post


class Command(BaseCommand):
    help = 'Генерирует preview-текст из текста заметки'

    def add_arguments(self, parser):
        parser.add_argument('ids', nargs='?', type=int)
        parser.add_argument(
            '--dry-run',
            action='store_true',
            help='Просто показать те заметки, что могут быть модифицированными',
        )


    def handle(self, *args, **options):
        if options['ids']:
            posts = Post.objects.filter(id__in=options['ids'], preview='')
        else:
            posts = Post.objects.all()

        for post in posts:
            if not options['dry_run']:
                post.preview = ' '.join(post.text.split()[:10])
                post.save()

            self.stdout.write(self.style.SUCCESS(f'Successfully generated for "{post}"'))

        self.stdout.write(self.style.SUCCESS('All done'))

В классе команды мы определяем help для указания общего описания команды.

Для определения аргументов создаём метод add_arguments. Если же нашей команде не нужны параметры вызова - можно и не писать этот метод. Сам синтаксис определения параметров схож с argparse, так что можно довольно гибко и понятно описать почти всё необходимое.

Сам же обработчик пишется в методе handle. Ключи и аргументы вызова команды прилетают в виде именованных параметров метода. Далее же всё как в обычной функции - пишите код обработчика, как вам будет угодно.

Для вывода же информации в Django команде стоит использовать self.stdout.write, ведь это будет не только информативно, но и красиво!

Если интересно, что дальше - читайте рубрику Django.

Изображение Python 3.11. Что нового?