te-touのブログ

音楽制作・車・プログラミング・旅行・その他考えてる事など、備忘録的なことも含めて個人的なページです。

ウェブアプリを作る。6(Djangoのモデルを定義して、DBをマイグレーションする。 )




前回まででDjangoの雛形まで作成しました。
www.te-tou.tokyo

次にすることは、テーブル定義の作成です。要は、データベース設計。
基本的に、これがないとやりたいことが実現出来ないと思います。が、これが一番キモとなる部分ですね。
ここでは業務とか本番環境とかではないので、ざっくり適当に作ります。
以前の記事を参考に。
www.te-tou.tokyo

Djangoのデータベース

Djangoの開発環境で使用するデータベースはSQLiteというものになります。
多分、物理的にデータベースサーバーに格納するのではなく、テキストファイルにデータを書き込んでゆく簡易的なものかと思います。
ディレクトリの中にsettings.pyというファイルがあり、その中を覗くとDATABASESという箇所がありdefaultで"ENGINE" :~~SQLite3と記述されています。

Djangoモデル定義

下のソースコードはエラーを修正した後のものになります。

from django.db import models

# Create your models here.
# 受審者テーブル
class testee(models.Model):
    # testee_id = models.IntegerField()
    testee_name = models.CharField(
        max_length=30,
        verbose_name='受審者'
        )
    grade_id = models.IntegerField()

# 段位テーブル
class grade(models.Model):
    GRADE_CHOICES = (
        (1, "初段"),
        (2, "二段"),
        (3, "三段"),
        (4, "四段"),
        (5, "五段"),
        (6, "六段"),
        (7, "練士"),
        (8, "七段"),
        (9, "教士"),
    )
    # grade_id = models.IntegerField()
    grade_name = models.CharField(
        max_length=4,
        verbose_name='段位',
        choices=GRADE_CHOICES
        )
    exam_grade = models.CharField(
        max_length=4,
        choices=GRADE_CHOICES,
        verbose_name='受審段位'
        )

# 採点表テーブル
class scoringsheet(models.Model):
    POINT_CHOICES = (
        (0.0, "0.0"),
        (0.5, "0.5"),
        (1.0, "1.0"),
        (1.5, "1.5"),
        (2.0, "2.0"),
        (2.5, "2.5"),
        (3.0, "3.0"),
        (3.5, "3.5"),
        (4.0, "4.0"),
        (4.5, "4.5"),
        (5.0, "5.0"),
        (5.5, "5.5"),
        (6.0, "6.0"),
        (6.5, "6.5"),
        (7.0, "7.0"),
        (7.5, "7.5"),
        (8.0, "8.0"),
        (8.5, "8.5"),
        (9.0, "9.0"),
        (9.5, "9.5"),
        (10.0, "10.0"),
    )
    RESULT_CHOICES = (
        (0, "不合格"),
        (1, "合格"),
    )
    testee_name = models.CharField(
        max_length=30,
        verbose_name='受審者'
        )
    exam_grade = models.CharField(
        max_length=4,
        verbose_name='段位'
        )
    score1 = models.FloatField(
        choices=POINT_CHOICES
    )
    score2 = models.FloatField(
        choices=POINT_CHOICES
    )
    score3 = models.FloatField(
        choices=POINT_CHOICES
    )
    score4 = models.FloatField(
        choices=POINT_CHOICES
    )
    score5 = models.FloatField(
        choices=POINT_CHOICES
    )
    pratical_points = models.FloatField()
    pratical_result = models.CharField(
        max_length=6,
        choices=RESULT_CHOICES
    )
    written_points = models.FloatField()
    written_result = models.CharField(
        max_length=6,
        choices=RESULT_CHOICES
    )
    judgement = models.CharField(
        max_length=6,
        choices=RESULT_CHOICES
    )

# 審査員テーブル
class markers(models.Model):
    marker_name = models.CharField(
        max_length=30,
        verbose_name='審査員'
    )
マイグレーション

migrationとは、Djangoにどんなデータを格納するのか。という事を指定するコマンドです。
データベースの定義を変更するたびに行う必要があります。
現在作成しているアプリでは下記のディレクトリでコマンドを打ちます。
project
┗ scoring-sheet
┗ scoringsheet<= このディレクトリへ移動します。

> ./manage.py makemigrations

画面がいろいろ動いて、
f:id:te-tou:20200223183920p:plain
エラーになりました。

なんか無駄に全角文字を使ってしまったようです。
なので、修正して。
...その後も幾多のエラーが出ましたが、メッセージを確認しながら修正して
f:id:te-tou:20200224001827p:plain
成功した模様です。
これで、データベースモデルのマイグレーションファイルが出来ました。

マイグレーションファイルが出来たら、マイグレーションを実行します。

> manage.py migrate

画面がいろいろ動いて、
f:id:te-tou:20200224005243p:plain
いろんな設定が確認されて、マイグレーション成功です。

これで、データベース定義が出来ました。