보통 우리는 manage.py 를 사용해서 ,
makemigrations 을 실항하거나 runserver 를 실행하게 된다.
하지만 manage.py 를 이용해서
커스텀 커맨드를 이용해 manage.py에 작업을 추가할 수 있다.
커스텀 커맨드는 <app_name>/management/<command_name>.py 경로에 있어야 한다
나는 --delete-all-category
라는 커맨드를 입력하면
if options['delete_all_category']: # create 하기전 category all delete
Category.objects.all().delete()
self.stdout.write(self.style.SUCCESS('deleted all category'))
이부분이 실행했으면 좋겠다 생각을 했고 ,
--add-category
라는 커맨드를 입력하게 되면 ,
if options['add_category']: # category create
Category.objects.create(name = "snack")
Category.objects.create(name = "gum")
Category.objects.create(name = "ramen")
Category.objects.create(name = "drink")
Category.objects.create(name = "imported_snack")
self.stdout.write(self.style.SUCCESS('Successfully added category '))
--b 라는 커맨드를 입력하면 logic_b 코드가 실행되게 하고 싶었다.
Django 는 Python의 표준 라이브러리의 일부인 argparse
를 사용한다.
사용자 정의 명령에서 인수를 처리하려면, add_arguments 라는 메소드를 정의해야한다.
python manage.py manage_products --add-category
python manage.py manage_products --delete-all-category
import csv
from pathlib import Path
from django.core.management.base import BaseCommand
from product.models import (Category,
Product)
class Command(BaseCommand):
help = 'manage product objects'
def add_arguments(self, parser):
parser.add_argument('--delete-all-category' , action = 'store_true' , dest = 'delete_all_category')
parser.add_argument('--add-category' , action = 'store_true' , dest = 'add_category')
def handle(self, *args, **options):
if options['delete_all_category']: # create 하기전 category all delete
Category.objects.all().delete()
self.stdout.write(self.style.SUCCESS('deleted all category'))
if options['add_category']: # category create
Category.objects.create(name = "snack")
Category.objects.create(name = "gum")
Category.objects.create(name = "ramen")
Category.objects.create(name = "drink")
Category.objects.create(name = "imported_snack")
self.stdout.write(self.style.SUCCESS('Successfully added category '))
인수의 이름 앞에 -- 가 없으면 필수값이고 위치에 기반한 파라미터가 되지만,
--가 붙으면 이름에 기반한 optional 인수가 된다.
action = "story_true" 는 만약 커맨드에 --add-category 가 포함된 경우, parse_args()
가 반환하는 객체에서 add-category 의 값이 True 로 지정된다.
만약 커맨드에 --delete-all-category 가 포함되지 않은 경우엔 delete-all-category 의 값이 False 로 지정된다.
parse_args()
가 반환하는 객체에 추가될 어트리뷰트의 이름
인수의 형식을 지정
python manage.py manage_products --delete-all-category
python manage.py manage_products --add-category
-- 커맨드에 --delete-all-category , --add-category 입력한경우
python manage.py manage_products --delete-all-category --add-category
handle() 메소드 안에 커스텀 커맨드의 기능 / 로직을 구현하면 됩니다.