LoginSignup
6
4

More than 3 years have passed since last update.

Djangoでcsvファイルを扱う(django-import-export)

Last updated at Posted at 2020-02-29

飲食店の経費を管理するアプリを作成した際に、
過去のデータを一気に取り込む必要があった為調べると、便利なプラグインがあった。
今後株価データなどの大量のデータを管理する時にも使えそうだと思いメモ。

開発環境

  • Mac os 10.15.3
  • python 3.7
  • django 2.2.8

サンプルのModel

models.py
from django.db import models
from datetime import datetime


class Category(models.Model):
    category_name = models.CharField(max_length=255,unique=True)


class Shop(models.Model):
    shop_name = models.CharField(max_length=255,unique=True)
    flag = models.IntegerField(verbose_name="フラグ")
    category = models.ForeignKey(Category, on_delete = models.PROTECT, verbose_name="カテゴリ")


class Cost(models.Model):
    date = models.DateField(verbose_name="日付",default=datetime.now)
    shop = models.ForeignKey(Shop, on_delete = models.PROTECT, verbose_name="店名")
    price = models.IntegerField(verbose_name="金額", help_text="半角入力")
    memo = models.CharField(verbose_name="備考", max_length=500, blank=True)
    created_at = models.DateTimeField(verbose_name='登録日時', auto_now_add=True)
    updated_at = models.DateTimeField(verbose_name='更新日時', auto_now=True)

飲食店の経費を管理するために、カテゴリー、仕入れ先、金額等と3つのモデルがあると過程。
あとはmodels.pyの通り。

django-import-exportのインストール

$ pipenv install django-import-export

上記はpipenvを利用した場合。
pipでインストールの場合は$ pip install django-import-exportで可能。

settings.pyにimport_exportを追加

settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # ・・・省略
    'import_export', # ここに追加
]

プロジェクト配下のsettings.pyのINSTALLED_APPSにimport_exportを追加

admin.pyに設定を追加

admin.py
from django.contrib import admin
from import_export import resources
from import_export.admin import ImportExportModelAdmin
from .models import Category, Shop, Cost

# Categoryモデルに統合する為にModelResourceを継承したクラスを作成
class CategoryResource(resources.ModelResource):
    class Meta:
        model = Category

# Shopモデルに統合する為にModelResourceを継承したクラスを作成
class ShopResource(resources.ModelResource):
    class Meta:
        model = Shop

# Costモデルに統合する為にModelResourceを継承したクラスを作成
class CostResource(resources.ModelResource):
    class Meta:
        model = Cost


@admin.register(Category)
# ImportExportModelAdminを継承したadminクラスを作成
class CategoryAdmin(ImportExportModelAdmin):
    ordering = ['id']
    list_display=('id', 'category_name')

    # resource_classにModelResourceを継承したクラスを設定
    resource_class = CategoryResource


@admin.register(Shop)
# ImportExportModelAdminを継承したadminクラスを作成
class ShopAdmin(ImportExportModelAdmin):
    ordering = ['id']
    list_display=('id', 'shop_name', 'flag', 'category')

    # resource_classにModelResourceを継承したクラスを設定
    resource_class = ShopResource


@admin.register(Cost)
# ImportExportModelAdminを継承したadminクラスを作成
class CostAdmin(ImportExportModelAdmin):
    ordering = ['id']
    list_display=('id', 'date', 'shop', 'price', 'memo')

    # resource_classにModelResourceを継承したクラスを設定
    resource_class = CostResource

ModelResourceを継承したクラスと、
ImportExportModelAdminを継承したadminクラスを作成し、
resource_classModelResourceを継承したクラスを記述するだけ。
定義したリソースクラスを管理画面で使えるようにするため、
admin.pyで紐づけているって考えるとわかりやすいかも。

任意のURL/adminにアクセス

ss.png
画像のようにインポートとエクスポートボタンが表示される。
実際にインポートとエクスポートがこれで可能。

ss 1.png

ちなみにcsv以外にも、xlsxlsxtsvjsonyamlにも対応している。
意外と便利。しかし、データが多くなると処理速度が少し遅い気がする。。。

参考にしたサイト

https://qiita.com/kira_puka/items/14a1a604a428a4c68884
https://django-import-export.readthedocs.io/en/stable/index.html

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4