Djangoで作る家計簿アプリ ①プロジェクトの初期設定

Djangoで作る家計簿アプリシリーズの一つ目の記事です。

今回はプロジェクトの初期設定として、モデルの作成とデータインポート、エクスポートの設定をしていきます。

必要ライブラリのインストール


まず任意のフォルダにrequirements.txtを作成して、中身を以下のようにします。

django
django-pandas
pandas
plotly
django-import-export


django-pandaspandasはデータの加工で使います。
モデルのデータをこれらのライブラリを使って加工するようなイメージです。

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


setting.pyの編集

以下のように編集していきます。

#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にします。



確定ボタンを押すと、プレビューが出てきます。



インポート実行を押すと、三件のデータが入りました。

TOPページ