ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] shell 명령어를 만들고 사용해보자 (BaseCommand)
    Python/Django 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!"))

Designed by Tistory.