Для того, чтобы добавить команду в 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.