본문 바로가기

가끔 배치 파일로 처리할 필요가 있다.

python manage.py runserver

처럼 간단하게 자기 명령어를 만들어서 수행할 필요가 있다.

아주 잘 정리되어 있는 글이 있다.

https://windybay.net/post/28/

 

Django 커스텀 manage.py 명령어 만들기

장고 프로젝트에서 manage.py 를 이용해 프로젝트 관련 명령을 실행할 때가 있다. 등등 테스트용 서버를 띄우거나 …

windybay.net

 

나도, 빙 코파일럿을 이용해서 초안을 더 작성해 봤다. 엑셀 파일 명을 받아서 DB 에 입력하는 예제를 만들어 달라고 요청하고 정리해봤다.

 

Django에서는 사용자가 커스텀 manage.py 명령어를 만들 수 있습니다.

이를 위해서는 Django 앱 내에 management/commands 디렉토리를 추가하고 해당 디렉토리 내에 실행하고 싶은 커맨드를 my_command.py와 같은 형식으로 만들어주면 됩니다. 이렇게 등록해주면 프로젝트의 루트 디렉토리에서 python manage.py my_command와 같이 실행할 수 있습니다.

 

커맨드의 기본 형식은 다음과 같습니다.

BaseCommand 클래스를 임포트해주고 이를 상속받는 class Command를 정의해줍니다. 커맨드 사용법을 문자열로 help 변수에 저장해주면 python manage.py help my_command을 실행했을 때 해당 내용이 출력됩니다. 클래스 내의 handle() 메서드에 실행하고 싶은 동작을 일반 파이썬 함수로 작성해 주면 됩니다.

 

커맨드에 동작 옵션을 추가해줄 수 있습니다. 클래스 내에 add_arguments() 메서드를 정의해주면 됩니다. 이 메서드 내에서 parser.add_argument()를 사용하여 위치 인자와 키워드 인자를 추가할 수 있습니다. 위치 인자는 명령어 실행 시 필수적으로 전달해야 하는 인자이며, 키워드 인자는 선택적으로 전달할 수 있는 인자입니다.

 

다음은 커스텀 manage.py 명령어의 예제 코드입니다. 이 코드는 인자로 전달된 엑셀 파일명을 사용하여 해당 파일을 읽어들인 후 데이터베이스에 입력하는 작업을 수행합니다.

import pandas as pd
from django.core.management.base import BaseCommand
from myapp.models import MyModel

class Command(BaseCommand):
    help = 'Import data from an Excel file into the database'

    def add_arguments(self, parser):
        parser.add_argument('filename', type=str, help='The name of the Excel file to import')

    def handle(self, *args, **kwargs):
        filename = kwargs['filename']

        # Read the data from the Excel file
        data = pd.read_excel(filename)

        # Iterate over the rows of the data and create new instances of MyModel
        for index, row in data.iterrows():
            MyModel.objects.create(
                field1=row['field1'],
                field2=row['field2'],
                ...
            )

        self.stdout.write(self.style.SUCCESS(f'Successfully imported data from {filename}'))

위의 코드에서 add_arguments() 메서드 내에서 parser.add_argument()를 사용하여 위치 인자 filename을 추가하고 있습니다. 이 인자는 명령어 실행 시 필수적으로 전달해야 하는 인자입니다.

handle() 메서드 내에서 kwargs 딕셔너리를 사용하여 전달된 파일명을 가져온 후 pandas 라이브러리의 read_excel() 함수를 사용하여 해당 파일을 읽어들입니다. 그런 다음 데이터의 각 행에 대해 반복하면서 MyModel의 새 인스턴스를 생성하고 데이터베이스에 저장합니다.

Django에서는 데이터베이스 입력을 위해 Model.objects.create() 메서드를 사용할 수 있습니다. 이 메서드는 모델의 새 인스턴스를 생성하고 데이터베이스에 저장하는 작업을 수행합니다.

 

B로그0간

개발 관련 글과 유용한 정보를 공유하는 공간입니다.