ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Custom Commands and django-seed
    Project using python/Cloning Airbnb 2021. 2. 25. 08:00

    Custom Commands

      모든 model의 틀을 잡았다면, 각 model의 test case를 생성해야 한다. 이것을 도와주는 것이 django의 custom command와 django-seed다.

    Custom Command diretory 구조

      directory 구조는 다음과 같다. app/management/commands/<command_name>을 생성하면 된다. management와 commands folder에는 __init__.py를 생성한다. (__pycache__는 신경쓸 필요 없다. command를 실행하면 자동으로 생성되는 것이다.)

    directory 구조

    __init__.py

      __init__.py를 생성하는 이유는 해당 디렉토리가 패키지의 일부임을 알려준다. python 3.3 버전 이후로는 __init__.py이 없어도 패키지로 인식된다고 하지만, 하위 호환(Backwards compatibility)을 위해 꼭 해주자.

    Source Code

      BaseCommand를 상속하는 Command class를 생성한다.

    source code 일부

    help

      $ python manage.py help <command>를 치면 밑에 스크린샷과 같이 해당 명령어가 어떤 명령어이고 어떤 option이 있는지 알려준다. 빨간 박스는 위 source code에서 정의한 help다. 

    add_arguments

      add_arguments() method는 option을 command에 option을 추가할 수 있는 method다. parser.add_argument()를 통해서 첫번째 인자로는 option의 이름을 준다. --(double dash)를 주면 optional arguments고 주지 않으면 positional arguments다. optional arguments를 주기 위해서 number 앞에 --(double dash)를 붙여줬다.

    add_arguments

    handle

      handle() method 실제 logic command다. add_arguments에서 만든 option을 options.get()을 통해서 가져오고 django-seed를 이용해서 test cases를 만든다. django-seed에 관한 설명은 django-seed 제목으로 추가했다.

     

    flatten

      seeder.excute()가 주는 값은 dictionary다. created_rooms.values()를 하게 되면 [[4,5]]같이 이중 배열을 반환한다. django의 flatten은 이중 리스트를 단일 배열로 flat하게 만들어준다. 그렇게 얻은 room_pks로 amenities, facilities, house_rules와 photos를 추가해준다.

    django-seed

    Installation

      $ pipenv install django-seed

    settings.py

      settings.py에 있는 THIRD_PARTY_APPS에 추가해준다.

    THIRD_PARTY_APPS on settings.py

    Usage

      seeder = Seed.seeder()를 통해서 seed를 할당해주고, seeder.add_entity()를 통해서 어떤 model을 얼마만큼 생성할 것인지 설정해준다. 3번째 인자로 특정 값을 default로 줄 수 있고 또는 random하게 주는 값의 범위를 제한할 수 있다. 마지막으로 seeder.execute()를 통해서 test cases를 생성하고 self.stdout.write()로 생성 메시지를 console에 출력한다.

      lambda 표현식은 생소할텐데, 설명하자면

    lambda 인자 : 표현식

    으로 사용한다. 표현식 부분을 return하는 부분이라고 생각하면 된다. JS ES6의 

    const a = (인자) => 표현식

    와 같다고 생각하면 된다.

     

    참고 자료

    소스 코드

    'Project using python > Cloning Airbnb' 카테고리의 다른 글

    room_card.html and model function  (0) 2021.02.26
    django CBV HomeView  (0) 2021.02.26
    Create Conversation Model and Admin  (0) 2021.02.24
    Create List Model and Admin  (0) 2021.02.24
    django-dotenv  (0) 2021.02.24

    댓글

Designed by Tistory.