9.【Django】データベースにカラムを追加してみよう

データベースに新しくカラムを追加する方法について学びましょう。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/ にアクセスします。

DjangoAdminのログインページ

ユーザー名とパスワードを入力してログインします。

DjangoAdminのログイン後ページ

Articlesテーブルの+Addボタンをクリック。

user_nameカラムが追加できています

新たに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ページの「こんちゃっす」をクリックします。

個別投稿ページ

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

このエントリーをはてなブックマークに追加

コメントを残す

頂いたコメントは一読した後表示させて頂いております。
反映まで数日かかる場合もございますがご了承下さい。