LoginSignup
6
7

More than 5 years have passed since last update.

Django Dataframe形式のデータをModelのデータとして取り込む

Last updated at Posted at 2018-10-06

やりたいこと

DataframeのデータをModelのデータとして取り込みさせ、
テンプレートを利用してWeb上に表示させたい。

環境

項目 Version
Django 2.1.1
python 3.6.5
pandas 0.23.4

※DBはSQLite(Django初期設定のまま)を使用。

経緯

自作のモジュールで抽出したデータを表形式で一覧表示させたかった。
csvにしようかとか色々模索したのだが、データを使って色々やりたいこともあり、Modelを利用してデータ保存するのが一番楽でよかった。
備忘も兼ねて初投稿してみました...

手順

ルート(url)の設定

お試しということで、データ登録用(登録確認)urlとデータ一覧表示用urlの準備をします。

urls.py
from django.urls import path
from . import views


app_name = 'polls'
urlpatterns = [
    path('create/', views.create_userdata, name='create'),
    path('list/', views.UserListView.as_view(), name='list'),
]

Modelの作成

(姓, 名)のフィールドをもったユーザモデルを作成します。

models.py
from django.db import models


class User(models.Model):
    first_name = models.CharField(primary_key=True, max_length=100)
    last_name = models.CharField(max_length=100)

Viewの作成

update_or_createを利用すると、登録対象のデータが既に存在している場合、指定したカラムの値を更新することができて便利です。
今回の例はfirst_nameを主キーに指定しているので、単にオブジェクトのcreateとするのは主キー重複エラーが発生する可能性がありよろしくないです。

views.py
from django.http import HttpResponse
from django.views.generic import ListView
import pandas as pd

from .models import User


def create_userdata(request):
    userdata = pd.DataFrame({
        "first_name": ["Satou", "Tanaka", "Katou", "Suzuki"],
        "last_name": ["Miyuki", "Yumi", "Kenta", "Asuka"]
    })

    for user in userdata.itertuples():
        User.objects.update_or_create(first_name=user.first_name, defaults={"last_name": user.last_name})

    return HttpResponse('Created UserData!!')


class UserListView(ListView):
    model = User

テンプレートの作成

{{姓}} : {{名}} がリスト形式で表示されるようにします。 

user_list.html
<ul>
  {% for data in user_list %}
  <li>{{ data.first_name }} : {{ data.last_name }}</li>
  {% endfor %}
</ul>

マイグレーション、Django起動

一通り準備が整ったので、コンソールからマイグレーションさせてDjangoを起動させます。

igimia$ python ./manage.py makemigrations
igimia$ python ./manage.py migrate
igimia$ python ./manage.py runserver

実行結果

Modelデータ生成

http://127.0.0.1:8000/polls/create/にアクセスすると
Created UserData!!と画面に表示されます。
SQLiteの中身をSelectしてみると...

sqlite> select * from polls_user;
Satou|Miyuki
Tanaka|Yumi
Katou|Kenta
Suzuki|Asuka

ちゃんと保存できた!

一覧表示

http://127.0.0.1:8000/polls/list/にアクセスするとSelectした結果のようにリストが表示されます。

注意事項

データをcreate/updateした後すぐにListを表示させても変更が反映されていないときがあります。キャッシュとか関係あるのだろうか...??
頻繁にDataframeからModelのデータとしてcreate/updateをするようなものにはあまり適していないのかもしれません(いい方法があるのかもしれないですが)。

大量データのcreate/updateでどのくらい時間がかかるのか試してみたいところです...

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