그 땐 IT활동했지/그 땐 영일영 근무했지

[010/Django] django-import-export | 기본적인 사용법

루이란 2022. 3. 10. 22:48
728x90

문제 상황

입사 초기에 수많은 휴대폰 대리점들의 정보를 서버 db에 넣어야 했다. 로컬에 있는 db.sqlite3를 올릴 수도 없으니 어떻게 넣어야 하나 싶었는데 django-import-export API를 이용해 손쉽게 넣을 수 있었다!

해당 API를 사용하면 엑셀에 저장되어 있는 자료를 admin페이지를 통해 쉽게 넣을 수 있다. 엑셀 뿐만 아니라 csv, json 등의 자료 형태도 지원하지만 엑셀이 가장 많이 쓰일 것 같다.

 

해당 API Document 참고!

https://django-import-export.readthedocs.io/en/latest/#

 

Django import / export — django-import-export 2.7.2.dev0 documentation

© Copyright 2012–2020, Bojan Mihelac Revision 0ad13e0c.

django-import-export.readthedocs.io

django-import-export를 사용할 수 있도록 세팅해보자!

1. django-import-export를 설치해준다.

$ pip install django-import-export

2. settings.py에 추가해준다.

INSTALLED_APPS = (
    ...
    'import_export',
)
$ python manage.py collectstatic

👉🏻collectstatic은 서버에 배포할 때 여러 앱별로 흩어져 있는 static 파일을 한 곳으로 모아주기 위해 쓰는 명령어이다. 

자료를 import 해보자!

엑셀 자료를 import하기 위해서는 딱 3단계만 필요하다!

1. admin.py를 작성한다.

#models.py
class Store(models.Model):
	name = models.CharField(max_length=70)
	location = models.CharField(max_length=140, null=True, blank=True)
	number = models.CharField(max_length=80, null=True, blank=True)

👉🏻내가 데이터를 넣으려는 모델을 간략화해서 만들어보았다. 핸드폰 가게에 대한 정보를 넣을 거라 가게 이름, 가게 위치, 가게 번호를 담을 model을 만들었다.

#admin.py
from import_export import resources
from import_export.admin import ImportExportModelAdmin
from .models import Store

class StoreResource(resources.ModelResource):
	class Meta:
		model = Store
		fields = ('id', 'name', 'location', 'number')
		export_order = fields


class StoreAdmin(ImportExportModelAdmin)
	fields = ('name', 'location', 'number')
	list_display = ('id', 'name', 'location', 'number')
	resource_class = StoreResource


admin.site.register(Store, StoreAdmin)

👉🏻db를 admin 페이지를 통해 넣기 때문에 admin.py에서 코드를 짜야한다. 총 2개의 class가 필요하다.

✍🏻StoreResource: 클래스 이름 그대로 db에 넣을 자료에 대해 정의한다.

  • model: 어떤 모델에 대한 자료인지 정의한다. → 나는 Store 모델!
  • fields: 어떤 필드를 넣을 지 정의한다. → 나는 모델의 모든 필드를 넣음
  • export_order: export할 때 어떠한 순서로 자료를 내보낼 지 정의한다.

✍🏻StoreAdmin: admin 페이지에서 어떻게 보일지 정의한다.

  • fields: admin에서 정보 상세 정보 페이지에 들어가면 보일 필드를 정의한다. 여기에서는 수정 가능한 필드만 적을 수 있다. (id나 created_at과 같은 필드는 수정할 수 없으므로 적을 수 없다.)
  • list_display: admin에서 해당 모델에 들어가면 보일 필드를 정의한다. 
  • resource_class: db에 넣을 자료에 대해 정의한 클래스를 지정한다.

✍🏻마지막으로 admin에 register하면 된다.

2. excel 자료를 준비한다.

각 핸드폰 대리점의 이름, 주소, 번호가 담긴 엑셀 자료

👉🏻db에 넣을 자료가 담긴 엑셀 자료를 준비한다!

✍🏻엑셀의 열 이름(id, name, location, number)은 admin.py의 fields에서 지정한 이름과 같아야 한다! 열 이름을 보고 같은 이름을 가진 필드를 찾아 저장하기 때문이다.

✍🏻id는 굳이 넣지 않아도 된다. 넣지 않으면 현재 db에 담긴 id의 다음 id부터 지정해 db를 저장한다. 

3. admin 페이지에서 import한다.

👉🏻자료를 넣을 모델에 들어가서 '가져오기'버튼을 누른다.

👉🏻원하는 파일을 선택하고 형식을 지정해준다. 그리고 '제출' 버튼을 누른다.

✍🏻노란 박스를 보면 넣을 수 있는 필드명이 보인다. 모델에 필드가 많아도 내가 넣을 자료에서 지정한 필드(id, name, location, number)는 4개뿐이기 때문에 해당되는 필드에만 데이터가 들어간다. 이 때 다른 필드들이 'null=true' 속성을 가지고 있어야 한다!(그렇지 않으면 null constrain 어쩌구 오류가 남!)

👉🏻데이터가 알맞게 들어가면 생성이라는 문구와 초록색으로 표시된다. 데이터가 알맞게 매칭되었는지 확인하고 '확인'버튼을 누르면 끝!

자료를 export 해보자

🐰자료 export도 짱 쉬움!

👉🏻'내보내기'버튼을 누른다.

👉🏻자료 형식을 지정하고 '제출'을 누른다.

👉🏻해당 자료가 뿅!⭐️

 

🐰django-import-export는 사용하면 할 수록 넘 마음에 들었던 API다!ㅎㅎ 

728x90