読者です 読者をやめる 読者になる 読者になる

脱職エントリー

いつか退職エントリーを書いて一人前のエンジニアを名乗りたい

Django入門その後に(5)〜モデルを作ろう〜

ここまでDjangoをほとんど書いてなくてジレッタイガーかもしれませんが、一つ一つの手順をじっくり理解しながら進むスタイルですのでご理解ください

余談ですがガラスの艦隊ってアニメは第1話で革命が起きて王制を倒してその革命のリーダーが実は女だったって所まで分かるぐらい20分に詰め込みましたが、2話以降はよく知りません。

1.MTVモデルの復習から

とにかく今回からやっとDjangoの製造にとっかかります。
まずはMTVのM、モデルから行こうと思います。
モデルって何だっけって人のためのイラストを再掲しますとこんな感じです。

MTVモデルについて
f:id:darakunomiti:20170507010044j:plain

要はデータベース部分です。最近はテーブル定義するのにSQL文とか要らないんですよね。Djangoで書いたものを反映してくれます。 すっごーい

2.実際に書いてみよう

今回追加するデータベースはinfoのアプリケーションで使うので/info/models.py に追加します。

from django.db import models  # お決まり


class Seiyuu(models.Model):  # SeiyuuというTableを宣言する、頭文字が大文字が流儀
    """声優さんの一覧"""

    #  性別を選択する選択肢を宣言
    GENDER_CHOICES = (
        (1, '男性'),
        (2, '女性'),
        (3, 'その他'),
    )

    # フィールドを定義します
    # verbose_name:人間に表示する名前を決める、adminサイトとかで使う
    name = models.CharField(max_length=255, verbose_name='名前')  # max_lengthは長さの最大値
    # choicesにタプルを指定することで選択肢のエリアにできる、
    # blankやnullをOKにするかどうか
    gender = models.IntegerField(verbose_name='性別', choices=GENDER_CHOICES, blank=True, null=True)
    birth_day = models.DateField(verbose_name='誕生日', blank=True, null=True)

    created_at = models.DateTimeField(auto_now_add=True)  # レコードが追加された時にその時間を保存します
    updated_at = models.DateTimeField(auto_now=True)  # レコードが更新されたタイミングで現在時間が保存されます。

    def __str__(self):  # クラスを呼び出したときに何が帰るか?(基本何でも良いです)
        return self.name

3. 細かく見てみよう

ここではSeiyuuというTableを宣言しています。

name = models.CharField(max_length=255, verbose_name='名前')

Char型の”名前”という最大255文字のfieldを宣言しています。
verbose_nameというのは人間にも分かる名前を意味しますが、後述するadminサイトで表示するときに「名前」と表示することができます。

choices

性別のように入力項目に制限がある場合は、choicesを使います。
タプルで宣言した項目だけが登録出来るようになります(この場合は1か2)

※タプルというのは、値の中身を絶対に変えられない配列です。丸括弧とカンマ区切りで宣言します。

4.戻り値

これを書いておかないと後述するadminサイトがエラーで表示されません。
とりあえずそのモデルの持つ代表的な項目を返せば良いと思います
あんまりよく分かってないです

書き方
    def __[戻すときの型]__(self):
        return self.戻すfield

    def __str__(self):
        return self.name

書き方のイメージはこんな感じです

[プロジェクトフォルダ]/[アプリケーション名]/models.py

from django.db import models # お決まりの書き方


class [TBL名](models.Model): 

    # フィールドを定義します
   フィールド名 = models.型Field(この中の書き方は色々)
 
    def __[型名]__(self):
        return self.フィールド名

覚えていて欲しいコーディングルールはこんな感じです。

  • TBL名はclass Xxxxで宣言する.
  • TBL名は先頭大文字で単語は複数単語の場合は繋げて書く(例: PrettyRhythm等)

  • field名は小文字で書く

  • field名は単語が複数の時はアンダースコアで繋げて書く(pretty_rhythm等)

ということでいい加減migrate(djangoに書いた定義を実際のデータベースに反映する)をしましょう。

Django入門その後に(6)〜migrateって何〜 - 脱職エントリー