データベースに新しくカラムを追加する方法について学びましょう。Djangoアプリケーションのデータベースを更新するには、まずモデルの定義を更新し、その変更差分を記録したマイグレーションファイルを作成、そしてその内容をデータベースに反映します。
目次
モデルファイルの修正
bbsアプリケーションのArticleモデルに投稿者の名前を表す user_name カラムを追加してみましょう。
まずはモデルファイルを修正します。
models.py
from django.db import models
class Article(models.Model):
content = models.CharField(max_length=140)
user_name = models.CharField(max_length=50, null = True) # nameカラムを追加
def __str__(self):
return self.content
既にレコードが登録されているデータベースに後からカラムを追加する場合、既に存在しているレコードはそのカラムが空になってしまいます。
そのため追加するカラムにはデフォルト値を指定するか、null(何もないことを示す記号)を許容する必要があります。
ここでは null = True として null を許容しています。
マイグレーションファイルの生成
次に、このモデルの変更差分を記録したマイグレーションファイルを作成します。
Windows PowerShell で次のコマンドを実行します。
py manage.py makemigrations bbs

これでマイグレーションファイルが生成されました。
作成されたマイグレーションファイルは bbs/migrations/0002_article_name_alter_article_content という名前で保存されています。
# Generated by Django 4.1.3 on 2022-11-14 21:48
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('bbs', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='article',
name='user_name',
field=models.CharField(max_length=50, null=True),
),
migrations.AlterField(
model_name='article',
name='content',
field=models.CharField(max_length=140),
),
]
データベースのマイグレーション
では、このファイルに記載されている変更差分をデータベースに反映してみましょう。
py manage.py migrate
データベースのマイグレーションが完了しました。
管理サイトで確認
Webサーバーを起動してデータベースの変更を確認してみましょう。
Djangoコマンドを使ってサーバーを起動し、ブラウザでhttp://127.0.0.1:8000/admin/ にアクセスします。
ユーザー名とパスワードを入力してログインします。
Articlesテーブルの+Addボタンをクリック。
新たにuser_nameカラムが追加できています。
試しに新しくデータを追加してみましょう。Content と User name にデータを入力して「SAVE」をクリックします。
新しくデータを追加できました。今追加した「こんちゃっす」をクリックして確認してみましょう。

今追加した User name カラムのデータも登録されているのが確認できます。
追加したカラムを表示
追加したカラムをWebページで表示するようテンプレートファイルを修正しましょう。
index.html に次のように追記します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Djangoを使ってみよう!</title>
</head>
<body>
<h1>Djangoで作る1行掲示板</h1>
{% for article in articles %}
<p>
<a href='{% url "bbs:detail" article.id %}'>{{ article.content }}</a>
{{ article.user_name }}<!-- user_nameを表示 -->
</p>
{% endfor %}
</body>
</html>
追加したカラムは models.py のArticleクラスに user_name という名前で定義してあり、views.py によってArticleクラスのデータは articles という名前でテンプレート側から呼び出せるようにしてあります。
さらにテンプレートファイルのループの中で各レコードは article という名前で呼び出せるようにしてあるため、user_name カラムのデータを呼び出したい時は article.user_name という名前で呼び出せる、というわけです。
detail.html でも同じように user_name に登録したデータを呼び出せるようにしてみましょう。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Djangoを使ってみよう!</title>
</head>
<body>
<h1>{{ article.id }}の個別投稿ページ</h1>
<p>{{ article.content }}, {{ article.user_name }}</p>
<p><a href='{% url "bbs:index" %}'>一覧ページへ戻る</a></p>
</body>
</html>
動作確認
では動作確認をしましょう。
Djangoコマンドを使ってサーバーを起動し、ブラウザでhttp://127.0.0.1:8000/bbs/ にアクセスします。

新しく追加した User name カラムのデータを表示できました。
個別投稿ページも確認してみましょう。
Webページの「こんちゃっす」をクリックします。

個別投稿ページでもユーザー名を表示することができました。







