見出し画像

【タレントダッシュボード構築 #2】djangoのモデル定義を理解する①

#1に続き、今回はdjangoのモデル定義についてまとめます。

djangoでは、SQLを書いてDBを定義するのではなく、「マイグレーション」操作によってDBを定義します。マイグレーション元として定義するのがmodels.pyです。

社員の基礎情報を集めるテーブルを定義する具体例に基づいて考えていきます。キーは社員コード、属性としていくつかの情報を持たせます。

【コラム:どうモデリングすべきか?】
エンジニアとしてはなるべく正規化してエンティティ定義したくなるところです。つまり、関数従属性をなるべく排除して、一つ一つのエンティティをなるべく小さくして、重複を排除し、更新漏れを防ぎ、性能を高めるアプローチです。

しかし、少なくとも社内のタレントダッシュボードにおいては、既存の人事ワークフローがあって、そこで発生する情報をなるべく早く捉えて情報を更新することが重要です。また、タレントダッシュボードを潤沢なヒューマンリソースでメンテナンスできる状況も少ないでしょう。

すなわち多くの場合、「既存のデータをインポートしやすいかどうか」が重要で、現在の業務に合わせてモデル定義をするのが適切だと思います。

[models.py]

class Item(models.Model):
   """
   クラス(社員基礎情報)
   """
   code_7 = models.CharField(verbose_name='社員コード',max_length=7,primary_key=True,)
   name = models.CharField(verbose_name='氏名',max_length=30,)
   name_kana = models.CharField(verbose_name='カナ氏名',max_length=30,)
   honbu = models.CharField(verbose_name='本部',max_length=30,)
   dept = models.CharField(verbose_name='部室',max_length=30,)
   yaku = models.CharField(verbose_name='役職',max_length=30,blank=True,null=True,)
   ent_date = models.DateField(verbose_name='入社日',)
   birth_date = models.DateField(verbose_name='生年月日',)
   soshiki = models.CharField(verbose_name='組織コード',max_length=9,)
   mail = models.CharField(verbose_name='メールアドレス',max_length=50,blank=True,null=True,)
   choketsu = models.CharField(verbose_name='長欠',max_length=1,blank=True,null=True,)
   kyushoku = models.CharField(verbose_name='休職',max_length=1,blank=True,null=True,)
   
   def __str__(self): # 管理画面などで表示するカラム
       return self.code_7
   
   class Meta: # 管理画面上のタイトル
       verbose_name = '社員基礎情報'
       verbose_name_plural = '社員基礎情報'

7桁の社員コードをキーとしています。
この項目で一意になるようモデリングしていくので、今回は引数primary_keyをTrueと定義しました。

models.pyを保存したら、manage.pyが置かれているディレクトリに遷移し、以下のコマンドでマイグレーションファイルを生成します。

$ python manage.py makemigrations

migrationsディレクトリ配下にファイルができていますね。

[0001_initial.py]

import django.core.validators
from django.db import migrations, models

class Migration(migrations.Migration):
   initial = True
   dependencies = [
   ]
   operations = [
       migrations.CreateModel(
           name='Item2',
           fields=[
               ('code_7', models.CharField(max_length=7, primary_key=True, serialize=False, verbose_name='社員コード')),
               ('name', models.CharField(max_length=30, verbose_name='氏名')),
               ('name_kana', models.CharField(max_length=30, verbose_name='カナ氏名')),
               ('honbu', models.CharField(max_length=30, verbose_name='本部')),
               ('dept', models.CharField(max_length=30, verbose_name='部室')),
               ('yaku', models.CharField(blank=True, max_length=30, null=True, verbose_name='役職')),
               ('ent_date', models.DateField(verbose_name='入社日')),
               ('birth_date', models.DateField(verbose_name='生年月日')),
               ('soshiki', models.CharField(max_length=9, verbose_name='組織コード')),
               ('mail', models.CharField(blank=True, max_length=50, null=True, verbose_name='メールアドレス')),
               ('choketsu', models.CharField(blank=True, max_length=1, null=True, verbose_name='長欠')),
               ('kyushoku', models.CharField(blank=True, max_length=1, null=True, verbose_name='休職')),
           ],
           options={
               'verbose_name': '社員基礎情報',
               'verbose_name_plural': '社員基礎情報',
           },
       ),
   ]

こうすればマイグレーション完了です。

$ python manage.py migrate
Operations to perform:
 Apply all migrations: app
Running migrations:
 Applying app.0001_initial... OK

なお、いずれの項目にもprimary_keyを設定しないでmigrateした場合は、マイグレーションファイル内で、以下のカラムが先頭に自動追加されます。

id = models.AutoField(primary_key=True)

AutoFieldはIntegerFieldと同じ数値項目で、管理画面からデータを追加する場合などには自動でインクリメントされます。

他にどのような型が用意されているかについて、詳細はマニュアルを参照してください。

いくつかのエンティティにリレーションを持たせたくなったときに利用するのがForeignKeyです。この説明は次回に回したいと思います。

この記事が気に入ったらサポートをしてみませんか?