Djangoのmodelについて理解する

# はじめに
Djangoで データベースを扱うときに使用するmodelについて理解する

# modelとは
Django ドキュメントからの 引用
> モデルは、データに関する唯一かつ決定的な情報源です。あなたが保持するデータが必要とするフィールドとその動作を定義します。一般的に、各モデルは単一のデータベースのテーブルに対応付けられます。
https://docs.djangoproject.com/ja/5.1/topics/db/models/

Djangoでアプリを作成した時に自動でmodels.pyが生成されますが、これはデータベースを作成する際に用いられる設計図のようなものになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895022/61a47a9b-bb75-bf3b-7e81-188c1744a80e.png)
ドキュメントにもあるように、データにどのような名前を付けるかどのようなデータを入れるかを定義するために使用されるのがmodels.pyになります。

# 実際のコードで確認する

例えば簡単なデータベースを考えていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895022/e40d9ba4-68ab-8b1b-c964-76d91bac02e3.png)


この場合、models.pyでは以下のように定義できます。
```python
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で定義したものが反映されているのを確認できます。
```python
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を読み込ませます。
```python
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
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895022/dce4346c-ef92-2361-ca93-85060a7ea193.png)

Sample modelsにアクセスして addを押すとmodels.pyで定義したmodelが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895022/84f448db-7f31-ade4-f29b-8a7e0603c3b9.png)

# まとめ
- 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文字以上にしたい場合も、カスタムユーザーだと可能なためです。