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!"))