DjangoのORMを利用してデータベースのデータを表示する

この記事ではDjangoでデータベースとモデルをマッピングさせて、モデルをビューに表示させるまでの手順を紹介します。

・DB→モデル→ビュー

の流れでデータが受け渡されていきます。

Djangoでは様々なデータベースと連携させることができますが、この記事ではDjangoのデフォルトのデータベースであるSQLiteを利用します。

PostgreSQL, MySQL, MariaDB, Oracleなどその他のDBを利用したい場合はsettings.pyを編集する必要があります。

バックエンドのデータベースの定義については下記のドキュメントを参照してください。

参考 DatabasesDjango Documentation

ここではデータベースにあるユーザーの情報を画面に表示させるサンプルを作っていきます。

ユーザーは以下のプロパティを持っているものとします。

  • 名前
  • 年齢
  • 自己紹介

データベースとモデルを連携させる手順は以下のとおりです。

  1. 初期のデータベースを作るためにマイグレーションを行う
  2. モデルを作成する
  3. 再度マイグレーションを行う
  4. テーブルが作成されていることを確認する
  5. ビューにモデルの内容を表示させる
  6. ビューを表示するためのURLパターンを設定する
  7. ビューにモデルの内容を表示させる

順番に作業していきましょう。

プロジェクトを作成してマイグレーションを行う

Djangoプロジェクトの作成から始めます。
Djangoでプロジェクトを作るための詳しい解説は下記の記事を参照してください。

pipenvを使ってDjangoプロジェクトを作成する

それでは、Djangoプロジェクトを作成するために、下記のコマンドを実行してください。

% mkdir profile
% cd profile
% pipenv install django==3.0.2
% pipenv shell
% django-admin startproject profile_project .
% python manage.py startapp profiles

ここまでで以下のようなディレクトリ・ファイルができます。

上記のpython manage.py startapp profilesによって、「profile_project」というDjangoプロジェクトに「profiles」という新しいアプリケーションが追加されました。

そのため、「profile_project」のsettings.pyのINSTALLED_APPSという変数に、追加したアプリケーションの設定情報を追記しなければいけません。

profile_project/settings.pyを開いてください。

以下のようにアプリケーションの設定ファイルへのパスを記載します。
profilesディレクトリのapps.pyにあるProfilesConfigクラスを読み込む、という意味です。

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'profiles.apps.ProfilesConfig', # 追記したもの
]

次にmigrateコマンドを実行します。
このコマンドによって、初期データベースが作成されます。

% python manage.py migrate

モデルを作成する

モデルはサイトを構成するデータベースへのアクセスを請け負います。

profiles/models.pyを開いてください。

from django.db import models

# Create your models here.
class Profile(models.Model):
  name = models.CharField(max_length=30)  # 名前
  age = models.CharField(max_length=3)  # 年齢
  introduction = models.TextField()  # 自己紹介

Modelのフィールドに定義できる内容は下記のドキュメントを参考にしてください。

参考 Model field referenceDjango documentation

Django開発ではモデルを作成・修正したタイミングでマイグレーションを行います。

以下のコマンドを実行してください。

% python manage.py makemigrations profiles
% python manage.py migrate

これでモデルのマイグレーションができました。

参考 Django Modelを使ってみようDjangoによるWebアプリケーション開発入門

管理者でログインしてデータベースを確認する

Djangoで管理者権限を使うには、はじめに管理者ユーザーを作成する必要があります。
以下のコマンドで管理者ユーザーを作ってください。
EmailやPasswordは任意でOKです。

% python manage.py createsuperuser
Username (leave blank to use 'fj'): fj
Email address: fj@email.com
Password: 
Password (again): 
This password is too short. It must contain at least 8 characters.
Bypass password validation and create

次にprofiles/admin.pyを開きます。

以下のコードを書いてください。

from django.contrib import admin
from .models import Profile # modelをインポート

admin.site.register(Profile) # インポートしたmodelを管理者サイトに登録する

次にpython manage.py runserverでサーバーを起動します。

http://127.0.0.1:8000/admin/を開くと、ユーザー名とパスワードを入力する画面が開きます。

管理者ページにモデル「Profile」が表示されているのがわかります。

「Add」をクリックすると、テーブルにデータを登録できます。

登録したデータを管理者画面で確認するためには、profiles/models.pyに__str__メソッドを追加しなければいけません。

profile/models.pyを以下のように編集します。

from django.db import models

# Create your models here.
class Profile(models.Model):
  name = models.CharField(max_length=30)  # 名前
  age = models.CharField(max_length=3)  # 年齢
  introduction = models.TextField()  # 自己紹介

  def __str__(self):
    data = self.name + ' | ' +  self.age + ' | ' + self.introduction
    return data

すると、管理者画面のデータベース上で、データが以下のように表示されます。

テーブルの内容をビューに表示させる

データベースの内容を表示させるための作業は以下のとおりです。

  • ビューを作成する
  • テンプレートを作成する
  • URLConfsを設定する

順番にやっていきましょう。

まずはprofiles/views.pyを開いて以下のように編集してください。
ListViewは一覧ページを作るときなどに利用するDjangoのテンプレートです。

from django.views.generic import ListView
from .models import Profile

class HomePageView(ListView):
  model = Profile
  template_name = 'home.html'
  context_object_name = 'all_profiles_list'

次に、templates/home.htmlを作成します。
templatesディレクトリはプロジェクトのルートディレクトリに置きます。

「TemplateDoesNotExist at」のエラーが出る場合は、templatesディレクトリの場所が間違っていないか確認してください。

templates/home.htmlには以下を書いてください。

<!-- templates/home.html-->
<h1>This is HomePage! Look at your data list!</h1>
<ul>
  {% for profile in all_profiles_list %}
    <li>NAME:{{ profile.name }} </br>
    AGE:{{ profile.age }} </br>
    INTRODUCTION: {{ profile.introduction }}</li>
  {% endfor %}
</ul>

profile/profile_project/settings.pyのTEMPLATES変数の「DIRS」にtemplatesディレクトリの場所を書きます。
これによって、Djangoにtemplatesの場所を教えることができます。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')], # 追記したもの
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

次にprofiles/urls.pyにビューを表示するためのURLConfの設定を行います。

from django.urls import path
from .views import HomePageView

urlpatterns = [
  path('', HomePageView.as_view(), name='home'),
]

ここまで書いたら、サーバーを起動してみましょう。

% python manage.py runserver

http://127.0.0.1:8000/を開くと、以下のようにテーブルの内容が表示されます。

管理者でログインして、さらにプロフィール(Profile)を追加してみます。

もう一度ホームページを開くと、テーブルに追加したデータが表示されました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です