django 프로젝트를 만들다보면, 테스트를 위해 필요할 때마다 django shell을 통해서 일시적인 코딩이 필요할 때가 많다. 게다가 그 코딩을 반복적으로 사용해야 할 경우가 많은데, 그 때마다 django shell에서 같은 코드를 실행시키는 것이 꽤나 불편하고 비효율적일 수 있다. 이 글에서는 django management 시스템에 내가 필요한 명령어를 만들고 사용하는 법을 정리한다.

사용할 코드

DB에서 뭔가를 빼와서 그 내용을 출력하는 작업을 예제로 삼겠다. DB에 아이템을 하나씩 추가할 때마다 그 아이템을 확인하고자 하는 상황이다. django shell을 통해서 다음과 같은 코드를 통해 테스트를 할 수 있을 것이다.


$ python manage.py shell


>>> from myapp.models import MyModel
>>> latest_instance = MyModel.objects.latest('pk')
>>> print(latest_instance.field1, latest_instance.field2)

가장 최근에 추가된 MyModel 테이블의 아이템을 갖고 와서 그 필드 몇 개를 확인해보는 꽤나 간단한 코드이다. 이제 더 이상 django shell에 같은 코드를 계속 입력하는 일을 하지 않기 위해 management 시스템에 위 코드를 나의 명령어로 등록하겠다.

management 폴더 만들기

myapp 폴더 안에 다음과 같이 폴더 구조를 만들어야 한다.

$ tree myapp

├── admin.py
├── apps.py
├── __init__.py
├── management
│   └── commands
### 이하 생략 ###

management 폴더를 생성해야 하고, 그 내부에 다시 commands라는 폴더를 만들어 놓으면 된다. python 2버젼을 사용하는 경우 이 두 폴더 안에 각각 __init__.py라는 빈 python 파일을 꼭 만들어야 한다는 점을 명심하자.

이제 commands 폴더 안에 내가 쓰고자 하는 명령어의 이름으로 python 파일을 작정해보자. 여기서는 mycommand.py라고 생성할 것이다.


# myapp/management/commands/mycommand.py
from django.core.management.base import BaseCommand
from myapp.models import MyModel
class Command(BaseCommand):
    help = 'check the latest instance of MyModel'
    def handle(self, *args, **kwargs):
        latest = MyModel.objects.latest('pk')
        stdout = '{f1} {f2}'.format(f1=latest.field1, f2=latest.field2)
        self.stdout.write(self.style.SUCCESS(stdout))

handle 메소드 안에 내가 쓰고 싶었던 코드를 넣었음을 확인할 수 있다. print 명령어를 통해 터미널에서 볼 수도 있지만 여기서는 Command object의 stdout 통로에 쓴 것을 알아두자.

또한 여기서 사용한 Command 클래스와 handle 메소드의 이름을 바꿔선 안된다는 점이 중요하니 꼭 지키도록 하자.

내 명령어 간편하게 사용하기

위 과정을 마쳤다면 내 명령어를 사용해봄으로써 명령어 등록이 잘 되었는지 확인해보자.


$ python manage.py mycommand

mycommand는 내가 만든 mycommand.py에서 온 것임을 기억하자. SUCCESS 스타일이 입혀진 녹색의 명령 결과가 나온다면 무사히 내 명령이 등록된 것이다. django shell을 열어 쓰는 것보다 편한 명령을 쓸 수 있게 되었다.


참조링크

django 공식 문서를 통해 더욱 자세한 사항을 알아볼 수 있다. 명령어의 옵션 설정 및 handle 외의 다른 메소드 사용법 등
https://docs.djangoproject.com/en/1.10/howto/custom-management-commands/