Django

Django Vuejs Scheduleアプリ作成(Total:8day29h)

スケジュール管理用アプリの作成

アプリの作成を実施

以前に、一気にアプリとmodelsを作ってから、makemigrationsをするとエラー地獄にはまった経験があり、あの時は、マジでパソコンをヘッドバッドで壊そうと思うぐらいだった

中学1年か2年の時、ゲームボーイをやってて腹が立って、画面にヘッドバッドしてしまって液晶がもれて、ゲームできなくなって公開した記憶があるなぁ(笑)それぐらいの怒りがでるほどだった(笑)

python manage.py startapp schedule
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    #サードパーティー
    'rest_framework',
    'corsheaders',
    'rest_framework_simplejwt',
    
    #アプリ
    'users',
    'shisetsu',
    'schedule', #追加
]

次はmodelsに追加していく

modelsを作成

from django.db import models
from utils.base_model import TimeStampedModel
from users.models import User
from shisetsu.models import *
from django.core.validators import MaxValueValidator, MinValueValidator
from django_currentuser.db.models import CurrentUserField
from django_currentuser.middleware import (
get_current_user, get_current_authenticated_user)
class Shift(TimeStampedModel):
'''
シフトマスタ
'''
shift_id = models.BigAutoField(primary_key=True, verbose_name='シフトID')
name = models.CharField(max_length=1, verbose_name='シフト名')
start_time = models.TimeField(verbose_name='開始時間')
end_time = models.TimeField(verbose_name='終了時間')
work_time = models.FloatField(verbose_name='労働時間', default=0)
night_shift = models.IntegerField(default=0, verbose_name='夜勤勤務数')
common_shift = models.BooleanField(default=False, verbose_name="共通シフト")
display_num = models.IntegerField(default=0, unique=True, verbose_name='表示順')
shisetsu = models.ManyToManyField(Shisetsu, null=True, blank=True, verbose_name=("使用施設"))
is_active = models.BooleanField(default=True, verbose_name='使用中')
created_by = CurrentUserField(verbose_name='登録者', related_name='shift_create')
update_by = CurrentUserField(verbose_name='更新者', on_update=True, related_name='shift_update')
class Meta:
db_table = 'm_shift'
verbose_name = 'シフト'
verbose_name_plural = 'シフト'
def __str__(self):
return self.name
class YearMonth(TimeStampedModel):
'''
年月トラン
'''
OPEN_FLG = (
('未', '未公開'),
('公', '公開済'),
)
year_month_id = models.BigAutoField(primary_key=True, verbose_name='年月ID')
year_month = models.IntegerField(verbose_name='年月')
start_date = models.DateField(verbose_name='開始日')
end_date = models.DateField(verbose_name='終了日')
days = models.IntegerField(verbose_name="日数")
open_flg = models.CharField(verbose_name='公開フラグ', max_length=1, choices=OPEN_FLG)
created_by = CurrentUserField(verbose_name='登録者', related_name='year_month_create')
update_by = CurrentUserField(verbose_name='更新者', on_update=True, related_name='year_month_update')
class Meta:
db_table = 't_yearmonth'
verbose_name = '年月トラン'
verbose_name_plural = '年月トラン'
def __str__(self):
return '{} {} {} {}'.format(self.year_month, self.start_date, self.end_date, self.open_flg)
class DayWeek(TimeStampedModel):
'''
日にち曜日トラン
'''
DAYWEEK = (
(0, '月'),
(1, '火'),
(2, '水'),
(3, '木'),
(4, '金'),
(5, '土'),
(6, '日'),
)
day_week_id = models.BigAutoField(primary_key=True, verbose_name='スケジュールID')
yearmonth = models.ForeignKey(YearMonth, verbose_name='年月トラン', on_delete=models.CASCADE, related_name='dayweek')
date = models.DateField(verbose_name='日付')
day = models.IntegerField(verbose_name='日にち')
day_week = models.IntegerField(verbose_name='曜日', max_length=1, choices=DAYWEEK)
created_by = CurrentUserField(verbose_name='登録者', related_name='dayweek_create')
update_by = CurrentUserField(verbose_name='更新者', on_update=True, related_name='dayweek_update')
class Meta:
db_table = 't_dayweek'
verbose_name = '日にち曜日トラン'
verbose_name_plural = '日にち曜日トラン'
constraints = [
models.UniqueConstraint(fields=['date'], name='date'),
]
def __str__(self):
return '{}, {}, {}'.format(self.date, self.day, self.day_week)
class BaseShift(TimeStampedModel):
'''
基本シフトマスタ
'''
DAYWEEK = (
(0, '月'),
(1, '火'),
(2, '水'),
(3, '木'),
(4, '金'),
(5, '土'),
(6, '日'),
)
base_shift_id = models.BigAutoField(primary_key=True, verbose_name='基本シフトID')
user = models.ForeignKey(User, verbose_name='社員名', on_delete=models.CASCADE, related_name='baseshift_user')
day_week = models.IntegerField(verbose_name='曜日', validators=[MinValueValidator(0), MaxValueValidator(6)], choices=DAYWEEK)
shisetu = models.ForeignKey(Shisetsu, verbose_name='所属施設', on_delete=models.SET_NULL, null=True, blank=True, related_name='baseshift_shisetsu')
shift = models.ForeignKey(Shift, verbose_name='シフト', on_delete=models.PROTECT, null=False, blank=False, related_name='baseshift_shift')
created_by = CurrentUserField(verbose_name='登録者', related_name='baseshift_create')
update_by = CurrentUserField(verbose_name='更新者', on_update=True, related_name='baseshift_update')
def __str__(self):
return '{}, {}, {}'.format(self.user, self.day_week, self.store, self.shift)
class Meta:
db_table = 'm_baseshift'
verbose_name = '基本シフト'
verbose_name_plural = '基本シフト'
constraints = [
#社員と曜日でユニーク
models.UniqueConstraint(
fields=['user', 'day_week'],
name='社員と曜日でユニーク重複チェック'
),
]
verbose_name = '基本シフト' #管理画面での表示名
verbose_name_plural = '基本シフト' #管理画面での表示名からSを取るため
class UserYearMonth(TimeStampedModel):
'''
社員年月トラン
'''
user_year_month_id = models.BigAutoField(verbose_name="社員年月トラン", primary_key=True)
year_month = models.ForeignKey(YearMonth, verbose_name="年月トラン", on_delete=models.CASCADE, related_name="user_year_month")
user = models.ForeignKey(User, verbose_name='社員', on_delete=models.CASCADE,)
memo = models.TextField(verbose_name="年月社員メモ", max_length=200, null=True, blank=True)
total_work_time = models.FloatField(verbose_name='月合計労働時間', default=0)
paid_break_time = models.FloatField(verbose_name='月合計有給時間', default=0)
created_by = CurrentUserField(verbose_name='登録者', related_name='user_year_month_create')
update_by = CurrentUserField(verbose_name='更新者', on_update=True, related_name='user_year_month_update')
class Meta:
db_table = 't_useryearmonth'
verbose_name = '社員年月トラン'
verbose_name_plural = '社員年月トラン'
def __str__(self):
return '{} {}'.format(self.year_month, self.user)
class Schedule(TimeStampedModel):
'''
スケジュールトラン
'''
schedule_id = models.BigAutoField(primary_key=True, verbose_name='スケジュールID')
user_yearmonth = models.ForeignKey(UserYearMonth, verbose_name='社員年月トラン', on_delete=models.CASCADE, related_name='user_yearmonth_schedule')
date = models.DateField(verbose_name='日付')
shisetsu1 = models.ForeignKey(Shisetsu, verbose_name='勤務地1', on_delete=models.SET_NULL, null=True, blank=True, related_name='schedule_shisesu1')
shift1 = models.ForeignKey(Shift, verbose_name='シフト1', on_delete=models.PROTECT, null=False, blank=False, related_name='schedule_shift1')
shisetsu2 = models.ForeignKey(Shisetsu, verbose_name='勤務地2', on_delete=models.SET_NULL, null=True, blank=True, related_name='schedule_shisetsu2')
shift2 = models.ForeignKey(Shift, verbose_name='シフト2', on_delete=models.PROTECT, null=True, blank=True, related_name='schedule_shift2')
shisetsu3 = models.ForeignKey(Shisetsu, verbose_name='勤務地3', on_delete=models.SET_NULL, null=True, blank=True, related_name='schedule_shisetsu3')
shift3 = models.ForeignKey(Shift, verbose_name='シフト3', on_delete=models.PROTECT, null=True, blank=True, related_name='schedule_shift3')
hope = models.BooleanField(verbose_name='希望', default=False)
work_time = models.FloatField(verbose_name='労働時間', default=0)
paid_break_time = models.FloatField(verbose_name='有給取得時間', default=0)
memo = models.CharField(verbose_name='メモ', max_length=50, null=True, blank=True)
created_by = CurrentUserField(verbose_name='登録者', related_name='schedule_create')
update_by = CurrentUserField(verbose_name='更新者', on_update=True, related_name='schedule_update')
class Meta:
db_table = 't_schedule'
verbose_name = 'スケジュールトラン'
verbose_name_plural = 'スケジュールトラン'
constraints = [
models.UniqueConstraint(fields=['user_yearmonth', 'date'], name='unique_booking'),
]
def __str__(self):
return '{}, {}, {}, {}, {}'.format(self.schedule_id, self.date, self.user_yearmonth, self.shisetsu1, self.shift1)

コードを書きながら、ちょっとどうしようかなって迷って修正したところこもあるのよねー
開発しながら柔軟に対応していっちゃおうという考えですすめよっと。

今ある技術でこなしていくことは得意やから、少し技術を覚えるとさらに無敵に近づいていく✌

-Django

© 2022 ごろう@縁紡ぐ