背景
この演習のゴール
- モデル(テーブル)の追加ができるようになること
完成図
用語
用語 | 説明 |
---|---|
models.Model | Djangoの全てのモデルの親クラス。これを継承することでORM機能を使える |
CharField() | 文字列用のフィールド。max_lengthで文字数制限を指定。 |
IntegerField() | 整数値を保存するフィールド。年齢や得点などに使われる。 |
ForeignKey() | 他のモデルとの「1対多」関係を作る。リレーションを構築できる。 |
class Meta: | モデルのメタ情報(テーブル名・並び順など)を定義する内部クラス。 |
db_table | 実際にDB上で使われるテーブル名を指定。省略時は「app名_モデル名」になる。 |
on_delete=models.CASCADE | 親が消されたら、子も自動で消える。親 → 子 に影響が波及(カスケード)する |
手順
models.pyを編集
models.py
from django.db import models
# クラス
class Classes(models.Model):
name = models.CharField(max_length=50)
class Meta:
db_table = 'classes'
# 学生
class Students(models.Model):
name = models.CharField(max_length=50)
grade = models.IntegerField()
class_fk = models.ForeignKey(Classes, on_delete=models.CASCADE)
class Meta:
db_table = 'students'
# テスト
class Tests(models.Model):
name = models.CharField(max_length=50)
class Meta:
db_table = 'tests'
# テスト結果
class TestResults(models.Model):
score = models.IntegerField()
student_fk = models.ForeignKey(Students, on_delete=models.CASCADE)
test_fk = models.ForeignKey(Tests, on_delete=models.CASCADE)
class Meta:
db_table = 'test_results'
モデルの変更を記録
zsh
python manage.py makemigrations アプリ名
DB反映
zsh
python manage.py migrate アプリ名
DBの確認
- 期待:「Classes」「Students」「Tests」「TestResults」が追加されていること
VSCode拡張「SQLite」で確認するが…ない??
解決:【DB再起動】
db.sqlite3 を右クリック → 「Close Database」 を選択
再度 Open Database で db.sqlite3 を選択し直す
ターミナルから確認
SQLiteシェルを開く
zsh
python manage.py dbshell
テーブルの確認
zsh
sqlite> .tables
結果(あった😮💨)
拡張機能の不具合かしらん?
zsh
sqlite> .tables
auth_group django_admin_log
auth_group_permissions django_content_type
auth_permission django_migrations
auth_user django_session
auth_user_groups **students**
auth_user_user_permissions **test_results**
**classes** **tests**
シェルを閉じる
zsh
sqlite> .quit
所要時間
- 15分