문제 상황
입사 초기에 수많은 휴대폰 대리점들의 정보를 서버 db에 넣어야 했다. 로컬에 있는 db.sqlite3를 올릴 수도 없으니 어떻게 넣어야 하나 싶었는데 django-import-export API를 이용해 손쉽게 넣을 수 있었다!
해당 API를 사용하면 엑셀에 저장되어 있는 자료를 admin페이지를 통해 쉽게 넣을 수 있다. 엑셀 뿐만 아니라 csv, json 등의 자료 형태도 지원하지만 엑셀이 가장 많이 쓰일 것 같다.
해당 API Document 참고!
https://django-import-export.readthedocs.io/en/latest/#
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다!ㅎㅎ
'그 땐 IT활동했지 > 그 땐 영일영 근무했지' 카테고리의 다른 글
[010/JS Library] chart.js | 기본적인 사용법 (0) | 2022.03.19 |
---|---|
[010/Django] django-import-export | Widget | ManyToManyWidget (0) | 2022.03.14 |
[010/Django] django-import-export | Widget | DateTimeWidget (0) | 2022.03.12 |
[010/Django] django-import-export | Widget | ForeignKeyWidget (0) | 2022.03.11 |
2021.10.13~ | 40조 통신 시장을 혁신할 핸드폰 버티컬 커머스 플랫폼 영일영 (0) | 2022.03.09 |