Djangoで作る家計簿アプリシリーズの一つ目の記事です。
今回はプロジェクトの初期設定として、モデルの作成とデータインポート、エクスポートの設定をしていきます。
まず任意のフォルダにrequirements.txt
を作成して、中身を以下のようにします。
django
django-pandas
pandas
plotly
django-import-export
django-pandas
とpandas
はデータの加工で使います。
モデルのデータをこれらのライブラリを使って加工するようなイメージです。
plotly
はグラフ描画に使うライブラリです。
plotlyを使うとグラフデータを簡単にhtml化できるので、Djangoで作るWEBアプリと相性がいいです。
django-import-export
は管理画面からデータをファイル形式を指定してインポートやエクスポートができるようになるライブラリです。
主にデータの投入に使います。
家計簿のようなアプリでは支出の登録件数が多くなると思いますので、適宜Excel等から取り込めるようにしておいた方がいいでしょう。
プロジェクトフォルダに仮想環境を作りinstallしていきます。
python -m venv myvenv
myvenv\scripts\activate
pip install -r requirements.txt
Djangoのコマンドでプロジェクトフォルダを作ります。
最後の.
を忘れないようにしましょう。
django-admin startproject project .
任意ですが、最初にやっておいて損はないです。
registerというアプリを追加します。
python manage.py startapp register
models.pyにカスタムユーザーを定義します。
# register/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
次にメインとなる家計簿アプリを作成します。
家計簿を直接表す英語はないみたいです。
ここは素直にkakeibo
としました。
python manage.py startapp kakeibo
以下のように編集していきます。
#project/settings.py
...
INSTALLED_APPS = [
'register.apps.RegisterConfig', # add
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'kakeibo.apps.KakeiboConfig', # add
'import_export', # add
]
...
# change
LANGUAGE_CODE = 'ja'
# change
TIME_ZONE = 'Asia/Tokyo'
...
# add
AUTH_USER_MODEL = 'register.User'
...
編集が終わったらmigrateをしてsuperuserを作っておきましょう。
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
家計簿アプリのモデルを作成していきます。
# kakeibo/models.py
from django.db import models
class PaymentCategory(models.Model):
name = models.CharField('カテゴリ名', max_length=32)
def __str__(self):
return self.name
class Payment(models.Model):
date = models.DateField('日付')
price = models.IntegerField('金額')
category = models.ForeignKey(PaymentCategory, on_delete=models.PROTECT, verbose_name='カテゴリ')
description = models.TextField('摘要', null=True, blank=True)
class IncomeCategory(models.Model):
name = models.CharField('カテゴリ名', max_length=32)
def __str__(self):
return self.name
class Income(models.Model):
date = models.DateField('日付')
price = models.IntegerField('金額')
category = models.ForeignKey(IncomeCategory, on_delete=models.PROTECT, verbose_name='カテゴリ')
description = models.TextField('摘要', null=True, blank=True)
支出と収入とそれぞれのカテゴリがあるというシンプルな構成にしてみました。
モデル作成後は忘れずにmigrateをしておきます。
python manage.py makemigrations
>>>
Migrations for 'kakeibo':
kakeibo\migrations\0001_initial.py
- Create model IncomeCategory
- Create model PaymentCategory
- Create model Payment
- Create model Income
python manage.py migrate
>>>
Operations to perform:
Apply all migrations: admin, auth, contenttypes, kakeibo, register, sessions
Running migrations:
Applying kakeibo.0001_initial... OK
管理サイトからデータのインポート、エクスポートできるに設定していきます。
ついでに管理しやすいように、摘要の検索や、カテゴリでの絞り込みも加えておきましょう。
admin.py
を以下のように編集します。
# kakeibo/admin.py
from django.contrib import admin
from .models import Payment, Income, PaymentCategory, IncomeCategory
from import_export import resources
from import_export.admin import ImportExportModelAdmin
class PaymentResource(resources.ModelResource):
class Meta:
model = Payment
class PaymentAdmin(ImportExportModelAdmin):
search_fields = ('description',)
list_display = ['date', 'category', 'price', 'description']
list_filter = ('category',)
ordering = ('-date',)
resource_class = PaymentResource
class PaymentCategoryResource(resources.ModelResource):
class Meta:
model = PaymentCategory
class PaymentCategoryAdmin(ImportExportModelAdmin):
resource_class = PaymentCategoryResource
class IncomeResource(resources.ModelResource):
class Meta:
model = Income
class IncomeAdmin(ImportExportModelAdmin):
search_fields = ('description',)
list_display = ['date', 'category', 'price', 'description']
list_filter = ('category',)
ordering = ('-date',)
resource_class = IncomeResource
class IncomeCategoryResource(resources.ModelResource):
class Meta:
model = IncomeCategory
class IncomeCategoryAdmin(ImportExportModelAdmin):
resource_class = IncomeCategoryResource
admin.site.register(PaymentCategory, PaymentCategoryAdmin)
admin.site.register(IncomeCategory, IncomeCategoryAdmin)
admin.site.register(Payment, PaymentAdmin)
admin.site.register(Income, IncomeAdmin)
サーバを立ち上げて管理サイトにログインしてみます。
右上にインポート
とエクスポート
というボタンが出ていることがわかります。
いくつか支出のカテゴリを追加してみると、フィルター機能が出現します。
とりあえず食費、水道高熱/通信、投資、交際費を追加しました。
収入のカテゴリですが、せっかくなのでインポート機能を使って初期データを投入してみましょう。
まずは空のデータをxlsxでエクスポートしましょう。
モデルの内容に沿って空のデータが出てきます。
ここのname
の列に記入します。
とりあえず給料、ボーナス、臨時収入としました。
次に管理サイトからこのファイルをインポートします。
先ほど作成したファイルを選択してフォーマットはxlsxにします。
確定ボタンを押すと、プレビューが出てきます。
インポート実行を押すと、三件のデータが入りました。