0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Djangoのmodelについて理解する

Posted at

はじめに

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

modelとは

Django ドキュメントからの 引用

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

Djangoでアプリを作成した時に自動でmodels.pyが生成されますが、これはデータベースを作成する際に用いられる設計図のようなものになります。
image.png
ドキュメントにもあるように、データにどのような名前を付けるかどのようなデータを入れるかを定義するために使用されるのがmodels.pyになります。

実際のコードで確認する

例えば簡単なデータベースを考えていきます。
image.png

この場合、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

image.png

Sample modelsにアクセスして addを押すとmodels.pyで定義したmodelが表示されます。
image.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文字以上にしたい場合も、カスタムユーザーだと可能なためです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?