Djangoのdjango-import-exportをAdmin以外で使用する方法

Django

django-import-exportが便利過ぎる

以前、Djangoでcsvをインポートするならdjango-import-exportが便利という記事で紹介したとおり、import-exportというパッケージがとても便利なので、その後も愛用しているのですが、今回はDjangoAdminで使うのではなく、Taskの中で使用したいということになり、使用方法を調べました。

packageを探してみる

まずは、パッケージを探してみると、どうやらdjango-import-export-celeryというものがあることが分かりました。

しかし、今回自分が使いたかった感じとはちょっと違かったので、このパッケージを参考に独自で開発することにしました。

探ってみたら実は超簡単に使用が出来た

実際にパッケージの中を見ていくと、拡張子を見て使用するclassを変えるとか、DjangoAdminでは表示していたエラー画面をどうするかなど、細かい機能が入っているのですが、今回自分が使いたいのは、本当にインポートを如何に簡単に出来るかなので、途中のところをすっ飛ばしたら凄い簡単に書けることが分かりました。

書き方は以下のような感じです。

from import_export.formats.base_formats import CSV

import_format = CSV()   # import_exportのインスタンス生成
data = open(file_name)  # csvファイルを読み込む
dataset = import_format.create_dataset(data)  # 読み込んだデータからdatasetを作成
resource = SomethingResource()  # 自分が作ったResourceのインスタンス生成
res = resource.import_data(dataset)  # datasetを読み込む

流れとしては、こんな感じです。超簡単ですね!

今回はcsvファイルを読み込んで、データをインポートするということで、CSVクラスを使用していますが、txtファイルやxlsファイルでもbase_formatsから読むクラスを変えるだけで行けると思います。

結果の中身を見てみる

最後にインポートした結果の詳細を見てみましょう。

上記でimport_dataから出力されたresの中身は、以下のような感じで見ることが出来ます。

from import_export.results import RowResult

print(res.totals[RowResult.IMPORT_TYPE_NEW])
print(res.totals[RowResult.IMPORT_TYPE_UPDATE])
print(res.totals[RowResult.IMPORT_TYPE_SKIP])
print(res.totals[RowResult.IMPORT_TYPE_ERROR])
print(res.totals[RowResult.IMPORT_TYPE_DELETE])
print(res.totals[RowResult.IMPORT_TYPE_INVALID])

これで結果が分かるので、途中での確認画面が無くても、十分使えますね。

最後に

django-import-exportは本当に便利なパッケージです。

これからも愛用していくことになりそうです!
皆さんも是非使ってみてください。

コメントを残す