1000個以上のデータを作成しているDjangoアプリのDBに追加したいんだけど、どうしたら良いのかわからないんだ・・・
実はとても便利な「django-import-export」を使えば一瞬でcsvデータを登録できるんだ。
その方法を今日は紹介していくよ♪
このブログを読むとできるようになること
大量のcsvデータをDBに一瞬で登録することが可能に
開発環境
Python=3.10.9
Django=3.2
Mac
VSCode
アプリ作成済みとしてスタートします。
作成中の下記アプリ、PubmedTransで薬剤データを一括でDBに登録する必要が出てきました。
https://pubmedtrans2.herokuapp.com/cms/list/
※csvファイル
データ数は約1600・・・手打ちではとんでもない時間がかかってしまいます。。
django-import-exportをインポート
$ pipenv install django-import-export
setting.pyに追加
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'cms.apps.CmsConfig',
'import_export', #追加
'bootstrap4',
]
createsuperuser(createsuperuserを作っている場合はスキップ)
$ python manage.py createsuperuser
ユーザー名 (leave blank to use 'hoge'): ※設定してください
メールアドレス: ※設定してください
Password: ※設定してください
Password (again): ※設定してください
Superuser created successfully.
$ python manage.py runserver
で開発環境を動かしてログインしてみます。
うぬ・・ちゃんとログインできている
models.py入力
今回使うcsvファイル
データ数:1682 形式:csv
列名(左から) cust_id、normal_name(一般名)、medi_name(商品名)、en_name(英語名)です。
csvファイルの列名が「id」だと、この後エラーが出ることがあるようなので注意!!
Djangoの方でも、id番号を設定してくれるので、お互いがぶつかってしまう可能性があるためでしょうか。
from django.db import models
# Create your models here.
class Medilist(models.Model):
normal_name = models.CharField(verbose_name='一般名', max_length=100, blank=True, null=True)
medi_name = models.CharField(verbose_name='商品名', max_length=100, blank=True, null=True)
en_name = models.CharField(verbose_name='英語名', max_length=100, blank=True, null=True)
cust_id = models.CharField(verbose_name='ID', max_length=100, blank=True, null=True)
class Meta:
db_table = 'mediDBlist'
verbose_name = '薬剤DBリスト'
verbose_name_plural = '薬剤DBリスト'
ここでは、データを入れるDBの列数と列名を設定しています。
【※参考】つけた名前はDBに今後このように表示されます。
verbose_nameは詳細な名前ということですので、わかりやすい名前をつけておきましょう。
class Metaでは、テーブル名を設定してます。
モデルを有効にしていなかったら有効化し,makemigrationとmigrate!
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'cms.apps.CmsConfig', #追加
'import_export',
'bootstrap4',
]
$ python manage.py makemigrations cms
Migrations for 'cms':
cms/migrations/0001_initial.py
- Create model Medilist
$ python manage.py migrate cms
Operations to perform:
Apply all migrations: cms
Running migrations:
Applying cms.0001_initial... OK
admin.py設定
from django.contrib import admin
from .models import Medilist # 追加
from import_export import resources # 追加
from import_export.admin import ImportExportModelAdmin # 追加
from import_export.fields import Field # 追加
class MedilistResource(resources.ModelResource):
normal_name = Field(attribute='normal_name', column_name='normal_name')
medi_name = Field(attribute='medi_name', column_name='medi_name')
en_name = Field(attribute='en_name', column_name='en_name')
cust_id = Field(attribute='cust_id', column_name='cust_id')
class Meta:
model = Medilist
# Controls if the import should skip unchanged records. Default value is False
skip_unchanged = True
use_bulk = True
@admin.register(Medilist)
class MedilistAdmin(ImportExportModelAdmin):
ordering = ['id']
list_display = ('id', 'normal_name', 'medi_name', 'en_name','cust_id')
# resource_classにModelResourceを継承したクラス設定
resource_class = MedilistResource
もし、DBの列名とcsvファイルの列名が異なる場合は、
attributeにmodels.pyで指定したDBの列名
column_nameでcsvファイル列名
を指定すると紐づけてくれます(´▽`)便利
データ入力設定
やっとメインの作業にやってきましたね!!
薬剤DBリストをクリックし、右上のインポートクリック
ファイルを選択して、確定クリック
確認画面が表示されるので、問題なければ右上のインポート実行をクリック!!!!
これでVSCodeの方を見てみると・・・
できている!!!すごい!
1700個くらいのデータだと、3秒くらいでDB化してくれていました!
なんだこの機能!凄すぎて椅子の上で飛び跳ねました。
ぜひみんな使ってみてね!
参考サイト
https://note.com/nssystems/n/n7cb1339f2a2c
主にこちらのサイトを参考にさせていただきました。
ちなみにこの後herokuにアプリをデプロイしてDBをそのまま利用したいときは下記のdumpdataを使うと便利です。