Djangoで家計簿を作ろう(2) | Pythonでなんか作ってみる

Djangoで家計簿を作ろう(2)

続いてViewやらTemplateやら弄っているうちに、全体のモデルがはっきりしてきたので、最初から作り直した。

モデルはこんな感じになった。

# -*- coding: utf-8 -*-
from django.db import models

class Kouza(models.Model):
name = models.CharField('名称',maxlength=200)
def __str__(self):
return self.name
class Meta:
verbose_name = '口座'
verbose_name_plural = verbose_name
class Admin:
pass

class Kaesuate(models.Model):
name = models.CharField('名称',maxlength=200)
def __str__(self):
return self.name
class Meta:
verbose_name = '返すあて'
verbose_name_plural = verbose_name
class Admin:
pass

class Koumoku(models.Model):
from datetime import datetime
kaesuate = models.ForeignKey(Kaesuate, verbose_name='返すあて')
kouza = models.ForeignKey(Kouza, verbose_name='口座')
siyoubi = models.DateTimeField('使用日', default=datetime.today())
meimoku = models.CharField('名目',maxlength=200)
kingaku = models.IntegerField('金額')
bikou = models.CharField('備考',maxlength=500,blank=True)
yotei = models.BooleanField('予定')

def __str__(self):
return "%s %s %d %s %s" % (self.siyoubi.strftime('%m/%d'),
self.kaesuate,
self.kingaku, self.meimoku,
self.bikou)

class Meta:
get_latest_by = 'siyoubi'
ordering = ['siyoubi']
verbose_name = '項目'
verbose_name_plural = verbose_name
class Admin:
pass

class CardKind(models.Model):
name = models.CharField('名称',maxlength=200)
hikiotosi = models.IntegerField('基本引落し日',blank=True)
kouza = models.ForeignKey(Kouza, verbose_name='口座')
def __str__(self):
return self.name
class Meta:
verbose_name = 'カードの種類'
verbose_name_plural = verbose_name
class Admin:
pass

class Card(models.Model):
koumoku = models.ForeignKey(Koumoku, verbose_name='項目')
kind = models.ForeignKey(CardKind, verbose_name='種類')
tuki = models.IntegerField('支払い月',blank=True)
sumi = models.BooleanField('支払い済み')

def __str__(self):
if self.sumi:
sumi='済'
else:
sumi='未'
return "%s %s %s" % (sumi,self.kind,self.koumoku)
class Meta:
verbose_name = 'カード払い'
verbose_name_plural = verbose_name
class Admin:
pass

class SyunyuKind(models.Model):
name = models.CharField('名称',maxlength=200)
def __str__(self):
return self.name
class Meta:
verbose_name = '収入の種類'
verbose_name_plural = verbose_name
class Admin:
pass

class Syunyu(models.Model):
koumoku = models.ForeignKey(Koumoku, verbose_name='項目')
kind = models.ForeignKey(SyunyuKind, verbose_name='種類')
def __str__(self):
return "%s %s" % (self.kind,self.koumoku)
class Meta:
verbose_name = '収入'
verbose_name_plural = verbose_name
class Admin:
pass

前借先(Kaesuate)と、銀行の口座(Kouza)を明確に分け、カード払いを示せるように、カード種別(CardKind)とカード払い(Card)のモデルを追加した。また、収入は、金額の±では無く、カード払いと同じように、収入種別(SyunyuKind)と収入(Syunyu)のモデルを追加した。
カード払いも収入も、項目へのリレーションを持つが、逆方向へのリレーションは持たない。
DjangoがDBのJOINを隠蔽してうまいことやってくれることを信じているが、やってくれるのだろうか?

ちなみに、あっちこっちローマ字表記なのは、英語名を考えるのに手が止まるのを嫌ってのことである。
変数名称とかに悩むと、すっごい時間がかかり、モチベーションが下がりまくるので、いんちきローマ字で表すことにした。
後でリファクタリングすりゃいいやとか考えていたが、データベースにデータを入れたまま、モデルを安全に更新する方法が分からない。

基本的に前回まで入れていたテストデータはまっさらに消えた。