0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

django-import-exportを使ってみてdjangoにcsvデータを追加

Last updated at Posted at 2020-04-24

はじめに

この記事ではdjango-import-exportのライブラリを使って,自作で作成したcsvファイルをdjangoに読みとる記事です.django-import-exportは管理画面からcsvファイルをimportしたりexportしたりできるライブラリです.これを用いて今回はBook,Publisherなどのモデルを作成し,これと関連する(一対一や一体多)csvファイルを読みとらせることまでをやります.加えて,使ってみた所感を記述していきたいと思います.

公式サイト: django-import-export

対象者

・ 自分で作ったcsvファイルのデータをdjangoのモデルに保存させたい人
・ django-import-exportを使って見ようと思ったけどうまくいかなかった人
・ データベースの一対一や多対一の内容について知っている人

環境

以下のパッケージをインストールしてください.

pip install django django-import-export

目次

  1. プロジェクト作成
  2. アプリ作成
  3. csvファイル作成
  4. importしてみる

プロジェクト作成

基本構成

django-admin startproject config .
python manage.py startapp Book

上記のコマンドでプロジェクトとモデルができるので,settings.pyにて追加app及びモジュールを記述します.

# config/settings.py

INSTALLED_APPS = [
    "import_export",#django-import-exportを使うのに必要
    "Book",#今回作成したapp
]

アプリ

今回はモデルを三個作成します.先ほど作成したBookのmodelsの中に以下のように記述します.

#Book/models.py
from django.db import models
class Publisher(models.Model):
    name = models.CharField("出版社名",max_length=100,help_text="出版社")

class Book(models.Model):
    title = models.CharField("タイトル",max_length=100,help_text="本のタイトル")
    publisher = models.ForeignKey(Publisher,on_delete=models.CASCADE)

class BookPrice(models.Model):
    book = models.OneToOneField(Book,on_delete=models.CASCADE)
    price = models.IntegerField("定価",help_text="本の定価")

モデルの内容は以下の通りです.
・ BookはPublisherと一体多の関係
・ BookPriceとBookは一対一の関係

django-import-exportの出番

これらのモデルにcsvファイルをimportさせるには管理画面から設定します.ここで登場するのがdjango-import-exportです.具体的な方法はadminを少し弄るだけで完了です.

#Book/admin.py
from django.contrib import admin
from import_export import resources
from import_export.admin import ImportMixin
from .models import Book,BookPrice,Publisher

class PublisherAdmin(ImportMixin,admin.ModelAdmin):
    class PublisherResource(resources.ModelResource):
        class Meta:
            model = Publisher
            fields = ("id","name",)
    resource_class = PublisherResource

class BookAdmin(ImportMixin,admin.ModelAdmin):
    class BookResource(resources.ModelResource):
        class Meta:
            model = Book
            fields = ("id","title","publisher",)
    resource_class = BookResource


class BookPriceAdmin(ImportMixin,admin.ModelAdmin):
    class BookPriceResource(resources.ModelResource):
        class Meta:
            model = BookPrice
            fields = ("id","book","price",)
    resource_class = BookPriceResource



admin.site.register(Publisher,PublisherAdmin)
admin.site.register(Book,BookAdmin)
admin.site.register(BookPrice,BookPriceAdmin)

**Resourceでimportするcsvファイルの詳細を設定します.fieldsには読み取るカラムを記述します.fields以外にもimport_id_fieldsなどがあり,idの指定を命じ的に行えたりします.その他にもcsvだけのformatを受け付けるものや,データに変更があった場合もimportをするかどうかを変更できたりします.

csvファイル作成

ここからはExcelにて三つのcsvファイルを作成します.以下のように他のモデルを指し示す時は連携するid番号を書くことにより,連携させることが可能となります.例えば,Bookの『君の声』と『君の音』は出版社中川文庫のオブジェクトを示しています.BookPriceのBookは一対一の関係にあるため,BookPriceとbookのid番号は同じになります.

モデル:Publisher

スクリーンショット 2020-04-24 18.10.46.png

モデル:Book

スクリーンショット 2020-04-24 18.27.56.png

モデル:BookPrice

スクリーンショット 2020-04-24 18.41.27.png

importしてみる

python manage.py createsuperuser #色々聞かれるけど書かれている通りぽちぽちする
python manage.py runserver

djangoの管理画面に行くと先ほど作成した三つのモデルが管理画面に写っていると思います.この中のPublisherをクリックしてもらうと,以下のような画面が表示されます.
スクリーンショット 2020-04-24 18.48.40.png
この画面の右上にIMPORTと表示されているので,ここからimportしていきます.すると,自分で作成していったモデルが登録されていきます.モデルとの連携もされているので確認してみてください.

終わりに

この記事てはdjango-import-exportを用いて,データをdjangoのモデル上に登録することをしました.具体的には,モデルを三つ作成しそれぞれが他のモデルと対応する関係にあるがそれらのidを指定することでデータの関係性を保てることを示しました.
次に機会があれば多対多のモデルの作成もやってみたいと思います.

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?