【Django】はじめてのDjangoアプリ第3回

django

PythonのWEBフレームワークDjangoを利用したアプリケーションの公式テュートリアルに沿ったWEBアプリケーション作成のメモ第3回です。

Writing your first Django app, part 2 | Django documentation
The web framework for perfectionists with deadlines.

前回は投票アプリの手初めてとして「Hello, world.」を表示させました。

今回はデータベースの作成をしていきます。

データベースの設定

「mysite/settings.py」内に「mysite」モジュールの設定が書かれています。

その中のデータベースの設定は次のようになっています。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

デフォルトでSQLite3を使用する設定になっています。

Pythonで公式にサポートしているデータベースエンジンは

  • PostgreSQL
  • MySQL
  • MariaDB
  • Oracle
  • SQLite3

です。

SQLite3以外のデータベースエンジンを使う場合は、ドライバー等の追加インストールが必要です。

その後に、この設定を書き換える必要があります。

今回はデフォルトのSQLite3を使っていきます。

ついでに同ファイル内の「TIME_ZONE」を「Asia/Tokyo」に変更します。

TIME_ZONE = 'Asia/Tokyo'

マイグレーション

次のコマンドでマイグレーションを実行します。

python manage.py migrate

デフォルトのテーブルが作成されます。

モデル作成

投票アプリ用に「Question」と「Choice」の2つのモデルを作成します。

▼「Question」モデル

対応テーブル名:「polls_question」

カラム名NOT NULLデフォルトオプション
idinteger主キー、自動連番
question_textvarchar最長200文字
pub_datedatetime

▼「Choice」モデル

対応テーブル名:「polls_choice」

カラム名NOT NULLデフォルトオプション
idinteger主キー、自動連番
question_idbigint外部キー:polls_question.id
on_delete: Cascade
choice_textvarchar最長200文字
votesinteger0デフォルト: 0

「polls/models.py」を編集します。

from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField("date published")

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

※テーブル名は[アプリケーション名]_[モデル名](全て小文字)

※各テーブルの主キー「id」カラムは自動生成されます。

※外部キーに指定したカラム名は、末尾に「_id」が自動付加されます。

投票アプリの設定追記

投票アプリをプロジェクトに含めるには、「INSTALLED_APPS」の設定に投票アプリの設定クラスを追記する必要があります。

「PollsConfig」クラスは「polls/apps.py」ファイル内にあるので、ドット記法でのクラスのパスは「polls.apps.PollsConfig」になります。

「mysite/settings.py」に「polls.apps.PollsConfig」を追記します。

INSTALLED_APPS = [
    "polls.apps.PollsConfig",
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
]

マイグレーション

次のコマンドを実行します。

python manage.py makemigrations polls

「polls/migrations/0001_initial.py」が作成されます。

# Generated by Django 5.0.6 on 2024-07-15 12:29

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Question',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('question_text', models.CharField(max_length=200)),
                ('pub_date', models.DateTimeField(verbose_name='date published')),
            ],
        ),
        migrations.CreateModel(
            name='Choice',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('choice_text', models.CharField(max_length=200)),
                ('votes', models.IntegerField(default=0)),
                ('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='polls.question')),
            ],
        ),
    ]

マイグレーション実行前に、実行されるSQLを確認してみます。

※この作業はスキップして問題ありません。

python manage.py sqlmigrate polls 0001

▼このようなSQLが出力されます。

BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" bigint NOT NULL REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;

次の点に注意してください。

🟢正確な出力は、使用しているデータベースによって異なります。上記の例は PostgreSQL 用に生成されています。
🟢テーブル名は、アプリの名前 (投票) とモデルの小文字の名前 (質問と選択肢) を組み合わせて自動的に生成されます。 (この動作はオーバーライドできます。)
🟢主キー (ID) は自動的に追加されます。 (これをオーバーライドすることもできます。)
🟢慣例により、Django は外部キー フィールド名に「_id」を追加します。 (はい、これをオーバーライドすることもできます。)
🟢外部キー関係は、FOREIGN KEY 制約によって明示的に行われます。 DEFERRABLE 部分については心配する必要はありません。これは、トランザクションが終了するまで外部キーを強制しないように PostgreSQL に指示します。
🟢使用しているデータベースに合わせて調整されているため、auto_increment (MySQL)、bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (PostgreSQL)、整数主キーの自動インクリメント (SQLite) などのデータベース固有のフィールド タイプが自動的に処理されます。フィールド名の引用符についても同様です。たとえば、二重引用符や一重引用符を使用します。
🟢sqlmigrate コマンドは実際にデータベース上でmigrationを実行しません。代わりに、SQL Django が必要と判断したものを確認できるように、migrationを画面に出力します。これは、Django が何をしようとしているのかを確認する場合や、変更に SQL スクリプトが必要なデータベース管理者がいる場合に便利です。

テーブルを作成するために、再度マイグレーションを実行します。

python manage.py migrate

テーブル「polls_question」と「polls_choice」が追加されました。

基本的に、migrateコマンドは、「django_migrations」内で定義しれているテーブル操作コマンド内で未実行のものだけを実行します。

モデルに変更を加えたら、

  • python manage.py makemigrations
  • python manage.py migrate

を実行する流れになります。

今回は以上です。

次回はデータベースの続きを予定しています。

  • 0
  • 0
  • 0
  • 0

コメント

タイトルとURLをコピーしました