はじめに
Djangoで データベースを扱うときに使用するmodelについて理解する
modelとは
Django ドキュメントからの 引用
モデルは、データに関する唯一かつ決定的な情報源です。あなたが保持するデータが必要とするフィールドとその動作を定義します。一般的に、各モデルは単一のデータベースのテーブルに対応付けられます。
https://docs.djangoproject.com/ja/5.1/topics/db/models/
Djangoでアプリを作成した時に自動でmodels.pyが生成されますが、これはデータベースを作成する際に用いられる設計図のようなものになります。
ドキュメントにもあるように、データにどのような名前を付けるかどのようなデータを入れるかを定義するために使用されるのがmodels.pyになります。
実際のコードで確認する
この場合、models.pyでは以下のように定義できます。
from django.db import models
class SampleModel(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
SampleModel classはデータベーステーブル(model)
nameはChartField(データ型)
ageはIntegerField(整数型)
としてデータをコード上で定義しています。
models.pyで作成したデータベースを反映させる
models.pyの中身を作成したら、データベースに内容を反映させる必要があります。
その時に使用するコマンドが、 makemigrationsとmigrate になります。
makemigrations とは
makemigrationsコマンドはデータベースの設計図のようなファイルを作成するためのコマンドです
コマンドを入力してみると設計図であるmigrationsファイルが生成されます。
> python manage.py makemigrations
Migrations for 'sample':
sample\migrations\0001_initial.py
+ Create model SampleModel
中身を確認すると models.pyで定義したものが反映されているのを確認できます。
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='SampleModel',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100)),
('age', models.IntegerField()),
],
),
]
migrate とは
migrateコマンドは先ほどmakemigrationsコマンドによって作成したファイルの内容に基づいてデータベースに内容を反映させるコマンドです。
> python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sample, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying sample.0001_initial... OK
Applying sessions.0001_initial... OK
...(以下省略)
OK の表示が出れば問題なく反映できています。
先ほど追加したコード以外の内容が記載されているのは、元々Djangoがデフォルトで追加したアプリに対してのコードになります。
データベースが追加されているか確認する
作成したデータベースが反映できているか管理画面で確認ができます。
管理画面から確認できるように設定を行います。
アプリのadmin.pyを開いて作成したSampleModelを読み込ませます。
from django.contrib import admin
from .models import SampleModel
admin.site.register(SampleModel)
superuserを作成します
> python .\manage.py createsuperuser
Username : XXXXX
Email address:
Password:
Password (again):
The password is too similar to the username.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
ユーザーを作成したら、サーバーを起動してhttp://127.0.0.1:8000/admin/
にアクセスし、先ほど作成したユーザーでログインします。
python manage.py runserver
Sample modelsにアクセスして addを押すとmodels.pyで定義したmodelが表示されます。
まとめ
- modelはデータベースを作成する際に用いられる設計図のようなもの
- models.pyで中身を簡単に定義できる
- migrateでデータベースを反映させて管理者画面で追加も可能
参考ページ:https://docs.djangoproject.com/ja/5.1/topics/db/models/
余談 ユーザーモデルとカスタムユーザー
今回は会員登録ページを作成する際の疑問を解消をするためにmodelについての学習を行った。
Djangoではユーザーモデルを元々定義していますが、カスタムユーザーモデルを推奨しています。
ユーザーモデルのドキュメント
https://docs.djangoproject.com/en/4.2/ref/contrib/auth/
カスタムユーザーモデルはユーザーモデルの情報を自身でカスタムできるモデルです。
例えばユーザー名を150文字以上にしたい場合も、カスタムユーザーだと可能なためです。