Python/Django

[Python] shell 명령어를 만들고 사용해보자 (BaseCommand)

insub4067 2021. 12. 9. 23:27

1. App dir 안에 management라는 dir와 __init__.py를 만든다.

2. 그안에 commands라는 dir와 __init__.py를 만든다

3. 그안에 사용할 명령어로된 이름의 파이썬 파일을 만든다

예) python manage.py seed_rooms = rooms.management.commands.seed_rooms.py

 

# seed_rooms.py

import random
# BaseCommand 이거 필수!
from django.core.management.base import BaseCommand
from django_seed import Seed
from rooms import models as room_models
from users import models as user_models


class Command(BaseCommand):
    help = "This command creates rooms"

	# 명령어에 arg를 넣어 줄수 있다. 
    # 예) $ python manage.py seed_rooms --numbers 50
    
    def add_arguments(self, parser) -> None:

        parser.add_argument(
      
        	# arg 이름
            "--numbers",
            
            # 입력이 없을 경우 디폴트
            default=1,
            
            # 인풋타입
            type=int,
            
            # python manage.py --help를 하게 되면 아래 글이 뜬다.
            help="How many rooms do you want to create?",
        )
	
    # 해당 명령어가 실행된 시 수행할 코드 
    # 아래 보는 코드는 Room이라는 모델로 db에 가짜 데이터를 넣어준다.
    
    def handle(self, *args, **options):
    
    	# 넘겨 받은 명령어의 arg
        number = options.get("numbers")
        
        # 가짜 데이터 만들어 주는 Seed 패키지
        seeder = Seed.seeder()
        
        # 모든 user에 대한 정보 가지고 오기
        all_users = user_models.User.objects.all()
        
        # room types에 대한 정보 가지고 오기
        room_types = room_models.RoomType.objects.all()
        
        # 실제로 db에 정보를 넣어주는 코드
        seeder.add_entity(
        	# 모델 지정
            room_models.Room,
            # 몇개의 데이터를 넣을지 매개변수로 알려준다
            number,
            {
            	# int혹은 text가 아닌 관계를 맺고 있는 fields들에 대한 랜덤 지정
                "host": lambda x: random.choice(all_users),
                "room_type": lambda x: random.choice(room_types),
            },
        )
        
        # 시더실행
        seeder.execute()
        
        # 성공시 콘솔에 띄어주는 프린트(엄밀히 말하면 프린트는 아니지만)
        self.stdout.write(self.style.SUCCESS(f"{number} Rooms Created!"))