やりたいこと
DataframeのデータをModelのデータとして取り込みさせ、
テンプレートを利用してWeb上に表示させたい。
環境
項目 | Version |
---|---|
Django | 2.1.1 |
python | 3.6.5 |
pandas | 0.23.4 |
※DBはSQLite(Django初期設定のまま)を使用。 |
経緯
自作のモジュールで抽出したデータを表形式で一覧表示させたかった。
csvにしようかとか色々模索したのだが、データを使って色々やりたいこともあり、Modelを利用してデータ保存するのが一番楽でよかった。
備忘も兼ねて初投稿してみました...
手順
ルート(url)の設定
お試しということで、データ登録用(登録確認)urlとデータ一覧表示用urlの準備をします。
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の作成
(姓, 名)のフィールドをもったユーザモデルを作成します。
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とするのは主キー重複エラーが発生する可能性がありよろしくないです。
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
テンプレートの作成
{{姓}} : {{名}} がリスト形式で表示されるようにします。
<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でどのくらい時間がかかるのか試してみたいところです...