ずっと作ろう作ろうと思っていた家計簿を、せっかくだからDjangoで作ってみた。
作ろうと思うたびに、モデリングとフレームワークの選定でお腹いっぱいになってしまっていたので、Djangoの チュートリアル2 まででできる内容を作ってみた(データベースにデータさえ入れれば、あとはどうにでもなるし)。
とりあえずの要件
現状は、自分が嫁のレシートを入力するだけなので、管理画面までの作成。
集計は直にSQLでするかもしれない(どんな集計をするのかは、ある程度データを投入してみてから考える)。
難しくしない
主な考え方
出費をレシートとしてとらえる
レシートの内訳に、カテゴリをつける
カテゴリはグループに属する(グループは、衣・食・住・社会保険・税等のレベルで作ろうと思う)
レシートには店をつける
で、書いたコードは次のようになった。
from django.core import meta
# Create your models here.
class Store(meta.Model):
fields = (
meta.CharField('name', 'Store Name', maxlength=50, core=True),
)
admin = meta.Admin()
def __repr__(self):
return self.name
class CategoryGroup(meta.Model):
fields = (
meta.CharField('group_name', 'Category Group name', maxlength=100, core=True),
)
admin = meta.Admin()
def __repr__(self):
return self.group_name
class Category(meta.Model):
fields = (
meta.CharField('name', 'Category Name', maxlength=100, core=True),
meta.ForeignKey(CategoryGroup),
)
admin = meta.Admin()
def __repr__(self):
return self.name
class Receipt(meta.Model):
fields = (
meta.DateField('buy_date', 'buying date', core=True),
meta.TextField('memo', 'memo'),
meta.ForeignKey(Store),
)
admin = meta.Admin(
list_display = ('buy_date', 'store', 'totalPrice'),
)
def __repr__(self):
return self.buy_date.strftime('%Y-%m-%d') + ':' + self.get_store().name
def store(self):
return self.get_store().name
def totalPrice(self):
totalPrice = 0
tmpList = self.get_item_list()
for i in range(len(tmpList)):
totalPrice += tmpList[i].totalPrice()
return totalPrice
class Item(meta.Model):
fields = (
meta.CharField('name', 'Item Name', maxlength=50, core=True),
meta.IntegerField('price', 'Item Price', core=True),
meta.IntegerField('amount', 'num', core=True),
meta.CharField('memo', 'Item memo', maxlength=500),
meta.ForeignKey(Receipt, edit_inline=True, num_in_admin=5, edit_inline_type=meta.TABULAR),
meta.ForeignKey(Category),
)
def __repr__(self):
return self.name
def totalPrice(self):
return self.price * self.amount
totalPrice.short_description = "Sub Total Price"