Django

Django Vuejs Modelを作成(Total:7day26h)

実際にmodelsを作成していこう

共通でつかうのは、作成日時更新日時

データの作成日時と更新日時って必ず持っていますよねー
過去に体験したのは、

困っている人
データが変…最終更新した人が誰かしりたい

ってことです。あとは、移行データなのかシステム稼働後に作られたデータなのかってのも、調べることがありました。

この中で、作成日時と更新日時は共通のものとして設定し、作成者と最終更新日時は、related_nameが必要なので各model作成時に設定しようと思う。

同じコードはなるべく共通化して使う方がいいっていうけど、時間と更新者がmodelsには全部設定するのに、共通化できてるのとできていないものがあるなら意味があるのかなぁ?

ちょっとした疑問(笑)コード各量が減るのでそれで対応をしておきます。

utils役立つためのフォルダを作成

色んなフォルダ名があるなって思ってるんですが、common共通、core 中心、utils役立つ、ググると色んなのが出てくるけど、なんだっていい(笑)
分かればいいのだ(笑)

base_modelファイルを作成して、時間だけ管理するmodelを書きます。

from django.utils import timezone
from django.db import models


class TimeStampedModel(models.Model):
    """
    models ([共通モデル]):
    """
    created_at = models.DateTimeField(verbose_name='作成日時', default=timezone.now)
    update_at = models.DateTimeField(verbose_name='更新日時', auto_now=True)

    # 抽象化設定
    class Meta:
        abstract = True

ポイント

django 更新 作成 時間 でググるとベストプラクティスとして出てきました!でも、本当にこれがベストプラクティスとは思ってない(笑)

施設アプリとスケジュールアプリを作成

施設と関連づけて機能拡張することは、安易に考えられる。
施設ごとのお知らせやら、利用者様の連絡事項等、発展する内容はさまざま考えられる…うーん、さすが

だから、依存関係をシンプルにするためにアプリ事態を分けちゃおうって発想

プログラミングするときは、英語というかアルファベットのつづりで作成されることが多い。別に日本語でもほとんど動くらしいが、フォルダ階層を指定するときは、うまく動かんらしい…
まぁ、初心者プログラマーがようわからんバグに巻き込まれると、平気で丸1日取られるから、素直にアルファベットで作る

なんで、こんなこと言い始めたかというと、施設って英語で『institution』らしい…けど、ちょっと英語が苦手で覚えれる自信が、今から、ボクシングを初めて、来年、井上尚弥を倒すぐらい自信がない(笑)

だから、アプリ名をshisetsuで作成するっていう、言い訳をしてきたのだ

python manage.py startapp shisetsu 

アプリを作ったら、settingsファイルのアプリを追加する。これは、一定の流として覚えてくといいねー

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',
]

models.py を編集

modelsは、viewsのようにフォルダを作って1個1個別ファイルで分けない理由…
それは、マイグレ障害地獄に陥ったことがあるからだ…なぜか、エラーがでる…何がどうなってどうなってどうなってどうなってどうなっているかわからんのだ

modelsはそんなに編集を頻繁に行わないとの、ひとり開発の場合、競合することがないから問題ないのだ!


そうだ忘れてた!最終更新者と作成者をつくための機能実装を

Django更新日時と更新者
Django 作成者・作成日時・更新者・更新日時を簡単に実装

システムはだいたい、作成者と作成日時、更新者と更新日時を持っています。なんでなんだろう?まぁ、だれが間違えたのかの犯人捜しのためかな? 実装するためのパッケージがあったので導入しようと思います。 ht ...

続きを見る

これをやれば簡単に実装できちゃう(⌒∇⌒)

ポイント

施設が新たにできたり、終了した時のことを考慮するべきかどうか…

これを考慮するだけで、開発工数が膨らんでしまいます…結局、こういう様々なことに最初にできるようにすることで、開発工数ってあがるんだということが良くわかる
本当に、必要かなぁ…開始日と終了日が範囲内である施設を取得する…これぐらいなら、まぁ、大変じゃない…

どこまで影響があるかわからんけど、まぁ、開始日と終了日ぐらいは持ってやろうか(笑)

from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
from django.core.mail import send_mail
from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _

from django.contrib.auth.models import PermissionsMixin, UserManager

from django.contrib.auth.validators import UnicodeUsernameValidator
from shisetsu.models import *


class User(AbstractBaseUser, PermissionsMixin):
    username_validator = UnicodeUsernameValidator()
    username = models.CharField(
        _('username'),
        max_length=7,
        unique=True,
        help_text=_('社員番号7桁'),
        validators=[username_validator],
        error_messages={
            'unique': _("すでに登録されている社員番号です"),
        },
    )
    first_name = models.CharField(_('姓'), max_length=30, blank=True)
    last_name = models.CharField(_('名'), max_length=150, blank=True)
    email = models.EmailField(_('Eメール'), blank=True)
    is_staff = models.BooleanField(
        _('管理者'),
        default=False,
        help_text=_('管理サイトにログインできるかどうか'),
    )
    is_active = models.BooleanField(
        _('退社済'),
        default=True,
        help_text=_(
            '無効フラグ'
        ),
    )
    shisetsu = models.ManyToManyField(Shisetsu, null=True, verbose_name='勤務先')
    join_date = models.DateField(verbose_name=_('入社日'), default='1900-01-01', blank = False, null = False)
    leave_date = models.DateField(verbose_name=_('退社日'), default='2099-01-01', blank = False, null = False)
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)
    objects = UserManager()

    EMAIL_FIELD = 'email'
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')
        # abstract = True

    def clean(self):
        super().clean()
        self.email = self.__class__.objects.normalize_email(self.email)

    def get_full_name(self):
        full_name = '%s %s' % (self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        return self.first_name

    def email_user(self, subject, message, from_email=None, **kwargs):
        """Send an email to this user."""
        send_mail(subject, message, from_email, [self.email], **kwargs)
from users.models import *
from utils.base_model import TimeStampedModel
import uuid
from django_currentuser.db.models import CurrentUserField
from django_currentuser.middleware import (
    get_current_user, get_current_authenticated_user)

class Shisetsu(TimeStampedModel):
    shisetsu_id = models.UUIDField(verbose_name='施設ID',primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(verbose_name='施設名', max_length=50)
    color = models.CharField(verbose_name='表示色', max_length=20, default='primary')
    yakan_kinmu = models.IntegerField(verbose_name='夜間必要者数', default=0)
    display_number= models.IntegerField(verbose_name='表示順', default=0)
    open_date = models.DateField(verbose_name='開始日')
    delete_date = models.DateField(verbose_name='終了日')
    created_by = CurrentUserField(verbose_name='登録者', related_name='shisetsu_create')
    update_by = CurrentUserField(verbose_name='更新者', on_update=True, related_name='shisetsu_update')

    def save(self, *args, **kwargs):
        self.updated_by = get_current_authenticated_user()
        super(Shisetsu, self).save(*args, **kwargs)

    class Meta:
        db_table = 'm_shisetsu'
        ordering = ["display_number"] 
        verbose_name = '施設マスタ'
        verbose_name_plural = '施設マスタ'

    def __str__(self):
        return self.name

これでmakemagrationsをしてみる。眠たいので今日は終わり

-Django

© 2022 ごろう@縁紡ぐ