Djangoモデル層とは何か?データベースとの関係を説明します。

こんにちは!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.フィールドのタイプで作られております。

公式ページの参考は以下になります。

参考: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で作ったテーブルを反映させます。(マイグレーションのモデルの変更パッケージを適応する。)

参考:migrate/makemigrations

では実際にマイグレーションファイルを作り適応しましょう。

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)
よかったらシェアしてね!
  • URLをコピーしました!
目次