python custom Command

BackEnd_Ash.log·2020년 5월 24일
0

https://simpleisbetterthancomplex.com/tutorial/2018/08/27/how-to-create-custom-django-management-commands.html

보통 우리는 manage.py 를 사용해서 ,
makemigrations 을 실항하거나 runserver 를 실행하게 된다.

하지만 manage.py 를 이용해서
커스텀 커맨드를 이용해 manage.py에 작업을 추가할 수 있다.

경로

커스텀 커맨드는 <app_name>/management/<command_name>.py 경로에 있어야 한다

manage_products.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 코드가 실행되게 하고 싶었다.

add_arguments 메서드

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 '))

name or flags : 옵션 문자열의 이름이나 리스트 .

인수의 이름 앞에 -- 가 없으면 필수값이고 위치에 기반한 파라미터가 되지만,
--가 붙으면 이름에 기반한 optional 인수가 된다.

action: 명령행에서 이 인자가 발견될 때 수행 할 액션의 기본형

action = "story_true" 는 만약 커맨드에 --add-category 가 포함된 경우, parse_args() 가 반환하는 객체에서 add-category 의 값이 True 로 지정된다.
만약 커맨드에 --delete-all-category 가 포함되지 않은 경우엔 delete-all-category 의 값이 False 로 지정된다.

dest

parse_args() 가 반환하는 객체에 추가될 어트리뷰트의 이름

type

인수의 형식을 지정

  • 커맨드에 --delete-all-category 만 입력할 경우
python manage.py manage_products --delete-all-category
  • 커맨드에 --add-category 만 입력할 경우
python manage.py manage_products --add-category

-- 커맨드에 --delete-all-category , --add-category 입력한경우

python manage.py manage_products --delete-all-category --add-category

handle() 메소드

handle() 메소드 안에 커스텀 커맨드의 기능 / 로직을 구현하면 됩니다.

profile
꾸준함이란 ... ?

0개의 댓글