content="o8Fpy_5mlavbp4rmTFyebSMR-oOz-T6XkJscIOJGx4I" 【django】【Python】django-import-exportを用いてcsvデータをDBに一括登録する - AOUNI BLOG

Django python プログラミング

【django】【Python】django-import-exportを用いてcsvデータをDBに一括登録する

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/

https://blueninini.com/%e5%80%8b%e4%ba%ba%e9%96%8b%e7%99%ba%e3%81%97%e3%81%9fweb%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%83%bbweb%e3%82%a2%e3%83%97%e3%83%aa%e5%85%ac%e9%96%8b%ef%bc%81%e2%91%a0pubmedtrans%e3%80%9c%e3%83%91/

※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を使うと便利です。

-Django, python, プログラミング
-, , , , ,