이 글에서는 django management 시스템에 내가 필요한 명령어를 만들고 사용하는 법을 정리한다.
django 프로젝트를 만들다보면, 테스트를 위해 필요할 때마다 django shell을 통해서 일시적인 코딩이 필요할 때가 많다. 게다가 그 코딩을 반복적으로 사용해야 할 경우가 많은데, 그 때마다 django shell에서 같은 코드를 실행시키는 것이 꽤나 불편하고 비효율적일 수 있다.
사용할 코드
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)
DB에서 뭔가를 빼와서 그 내용을 출력하는 작업을 예제로 삼겠다
가장 최근에 추가된 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
을 열어 쓰는 것보다 편한 명령을 쓸 수 있게 되었다.
참조링크
https://docs.djangoproject.com/en/1.10/howto/custom-management-commands/
'괴발개발 > Django' 카테고리의 다른 글
내가 자고 있는 순간에도 Django는 일을 한다! django crontab 사용방법 (0) | 2022.12.11 |
---|---|
django order_by 한글 정렬하기 (글자수 무시하고 가나다 순으로만) (0) | 2022.09.27 |
[Django] kakao social login allauth로는 안되는 증상 (0) | 2021.08.07 |
[Django] User Group을 이용하여 권한을 부여해보자 (minxin사용) (0) | 2021.08.04 |
[django] duplicate key value violates unique constraint 오류 문제 해결 (0) | 2021.08.03 |