こんにちは!TodoONadaの土門(@daikidomon)です。
皆さん、こんにちは。
今日はDjangoのモデルについて紹介したいと思います。
これまでの記事: これまでの記事ではファイルの構造は以下の様になっております。
mysite
├── db.sqlite3
├── hello
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ ├── __init__.py
│ │ └── __pycache__
│ │ └── __init__.cpython-36.pyc
│ ├── models.py
│ ├── __pycache__
│ │ ├── admin.cpython-36.pyc
│ │ ├── __init__.cpython-36.pyc
│ │ ├── models.cpython-36.pyc
│ │ ├── urls.cpython-36.pyc
│ │ └── views.cpython-36.pyc
│ ├── static
│ │ └── css
│ │ ├── bootstrap.min.css
│ │ └── style.css
│ ├── templates
│ │ └── index.html
│ ├── tests.py
│ ├── urls.py
│ └── views.py
├── manage.py
└── mysite
├── asgi.py
├── __init__.py
├── __pycache__
│ ├── __init__.cpython-36.pyc
│ ├── settings.cpython-36.pyc
│ ├── urls.cpython-36.pyc
│ └── wsgi.cpython-36.pyc
├── settings.py
├── urls.py
└── wsgi.py
この記事まででデータベースの設計とアプリのインストールを終わらせてます。
初めての方は初期設定から確認をお願いします。
[st-card id=5404 label=\ name=\ bgcolor=\ color=\ fontawesome=\ readmore=on\]
Djangoのモデルとは何か?
データベースのテーブルを設計した後、アプリ開発でデータベースにテーブルを作る必要があります。
Djangoはアプリのテーブルを作成する時にはモデル内にテーブルの定義を書きます。
これはモデル(自動生成されたmodels.py)の中に定義を書き、コマンドを入力すればデータベースにテーブルを生成することができます。
例のmodels.pyはいかになります。(Djangoオフィシャルページより)
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
これはデータベースないで以下の様にテーブルを作るのと同じです。
CREATE TABLE myapp_person (
id serial NOT NULL PRIMARY KEY,
first_name varchar(30) NOT NULL,
last_name varchar(30) NOT NULL
);
Djangoではmodels.フィールドのタイプで作られております。
公式ページの参考は以下になります。
モデルのフィールドタイプの説明
モデルのフィールドタイプは以下になります。
[table id=77 /]
参考: フィールドタイプ
モデルのリレーションフィールド
モデルのリレーションフィールドは以下になります。
[table id=78 /]
参考:リレーションフィールド
モデルのフィールドオプションの説明
モデルのフィールドオプションの説明は以下になります。
[table id=79 /]
参考: フィールドオプション
モデルの書き込み
では実際にデータベースにテーブルを入れる準備をしてみましょう。
今回は個人情報管理アプリを作ってみましょう。
個人情報は以下になります。
- 姓–Last Name
- 名–First Name
- 性別–Gender
- 年齢–Age
- 誕生日–Birthday
- メールアドレス–E-mail
ではmysite/hello/models.pyを以下の様に編集してデータベースへテーブルを反映する準備をします。
from django.db import models
# Create your models here.
class Personinfo(models.Model):
GENDER = [
('Male','Male'),
('Female','Female'),
]
last_name = models.CharField(max_length=30)
first_name = models.CharField(max_length=30)
gender = models.CharField(max_length=10,choices=GENDER)
age = models.IntegerField(default=0)
birthday = models.DateField()
email = models.EmailField()
これで準備を完了しました。次はデータベースに今作ったテーブルを反映させます。
モデルのmigrate/makemigrations
次は先ほど作成したテーブルを反映させる方法を紹介します。
反映するために二つのコマンドを知る必要があります。
コマンドは以下になります。
- makemigrationsマイグレーションファイルを作成します。(マイグレーションファイルはモデルの変更をパッケージングする。)
- migrateはデータベースにmodels.pyで作ったテーブルを反映させます。(マイグレーションのモデルの変更パッケージを適応する。)
では実際にマイグレーションファイルを作り適応しましょう。
mysite/ディレクトリに行き以下のコマンドを打ちます。
python manage.py makemigration
# Migrations for 'hello':
# hello/migrations/0001_initial.py
# - Create model Personinfo
その後以下のコマンドを打ちます。
python manage.py migrate
# Operations to perform:
# Apply all migrations: admin, auth, contenttypes, hello, sessions
# Running migrations:
# Applying hello.0001_initial... OK
これで反映完了です。 反映前のデータベースは以下です。
+----------------------------+
| Tables_in_mysite_sample |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+----------------------------+
10 rows in set (0.00 sec)
反映後のデータベースは以下です。
+----------------------------+
| Tables_in_mysite_sample |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
| hello_personinfo |
+----------------------------+
11 rows in set (0.00 sec)