この記事は以下のターゲットを対象としています。
★5 Djangoの開発経験が3年以上。
★4 Djangoの開発経験が1年以上。
★3 WEBサイト開発経験あり。これからDjangoを学習します。
★2 Python初級者。簡単なプログラムコードが書けます。
★1 プログラミング未経験。
こんにちは、グローバルウェイの大坪です。
今回はpythonのフレームワークであるDjangoでのDB操作として、マイグレーション編について紹介します。
マイグレーションとは
マイグレーション (Migrations) は、Django でモデルに対して行った変更 (フィールドの追加やモデルの削除など) をデータベーススキーマに反映させる方法です。
この記事ではマイグレーションでDBにテーブルを定義し、管理者画面からレコードを追加してみたいと思います。
Djangoプロジェクトは前回の記事で作成したものを引き続き使用しています。
前回のブログはこちら(https://gw-python.com/archives/72)
DBのセットアップ
接続先のDBはsettings.pyで指定します。デフォルトではSQLiteが設定されています。今回はデフォルトのままとします。
-- mysite/settings.py
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}
また、settings.pyではINSTALLED_APPSでアクティブ化するDjangoアプリケーションを管理しています。デフォルトのアプリに加えてブログアプリも指定しておきます。
-- mysite/settings.py
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"blog.apps.BlogConfig",
]
デフォルトのアプリはマイグレーションファイルが用意されているので、下記コマンドでマイグレーションを行うことが出来ます。
$ python manage.py migrate
DBにテーブルが作成されたことが確認できました。
モデルの作成
次にモデルを作成します。モデルはデータベースのテーブルを表すクラスです。モデルを使用してCRUD操作を行なったり、マイグレーションでDBにテーブルを定義したりすることができます。
今回はブログアプリなので、Blogクラスを作成します。
-- mysite/blog/models.py
from django.contrib.auth.models import User
from django.db import models
from django.utils import timezone
class Blog(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(default=timezone.now)
created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_created_by')
updated_at = models.DateTimeField(default=timezone.now)
updated_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_updated_by')
モデルはdjango.db.models.Modelを継承して作成します。モデルのクラス変数はテーブルのカラムと対応しており、フィールドのインスタンスを格納します。
- CharField: 文字列を保持するためのフィールドで、max_lenthで最大文字数を指定します。
- TextField: 長い文字列を保持するためのフィールドです。
- DateTimeField: 日時データを保持するためのフィールドです。ここではデフォルトで現在日時を指定しています。
- ForeignKey: モデル間の1対多の関係を定義するためのフィールドです。ここではdjango.contrib.authで提供されているデフォルトのUserモデルを外部キーに使用しています。また、逆参照の際の名前が重複するため、related_nameをcreated_byとupdated_byに指定しています。
クラスを定義したので、下記コマンドを実行することでblog/migrations配下にマイグレーションファイルが作成されます。
$ python manage.py makemigrations blog
Migrations for 'blog':
blog\migrations\0001_initial.py
- Create model Blog
マイグレーションファイルを作成できたので、マイグレーションを実行するとBlogテーブルを作成できます。
$ python manage.py migrate blog
Operations to perform:
Apply all migrations: blog
Running migrations:
Applying blog.0001_initial... OK
まとめると、下記の3ステップで簡単にDBの定義を更新することができます。
①models.pyでモデルを変更
②makemigraionsを実行して、マイグレーションファイル作成
③migrateを実行して、DBの定義を更新
管理機能
Djangoではデフォルトで管理機能が用意されています。今回はその機能を使用して作成したテーブルにデータを追加します。
まず、管理サイトにログインするためのユーザーを作成する必要があります。下記コマンドを実行し、ユーザー名、メールアドレス、パスワードを入力すると管理者ユーザーを作成することができます。
$ python manage.py createsuperuser
http://127.0.0.1:8000/admin/にアクセスとログイン画面が表示されます。
※settings.pyのLANGUAGE_CODEを「ja」に設定すると日本語で表示できます。
上記で登録した情報を入力するとログインすることができます。
デフォルトではdjango.contrib.authで提供されているグループ、ユーザーが編集可能なコンテンツとして表示されています。
ブログアプリのデータを編集するにはblog/admin.pyを編集する必要があります。
--blog/admin.py
from django.contrib import admin
from blog.models import Blog
admin.site.register(Blog)
admin.pyを編集し画面を更新すると、Blogの項目が表示されました。
ユーザーを登録してみます。「+追加」を押下すると追加画面に遷移できます。各項目を入力して、保存するとデータを追加することができます。
次にブログも追加してみます。created_byやupdated_byはユーザーを外部キーに指定したので、選択肢に上記で作成したユーザーが表示されています。
テーブルにもレコードが登録されていることが確認できます。
まとめ
Djangoのマイグレーションについて説明しました。マイグレーションを用いると簡単にDBの定義を変更することができます。次回はDjangoでのCRUD操作について説明したいと思います。