はじめに
本記事は Django の公式ドキュメントのDjango の概要を整理・加筆したものです。
理解しにくい部分を噛み砕いてまとめ直しました。
Django ドキュメント
1.1.Django の概要
Django について
- 新聞社で開発された
- Web アプリ開発のフレームワークである
- Web 開発タスクを迅速かつ簡単化するように設計された
本項の内容
- データベースを使った Web アプリ開発の概要の説明をする
本項の目的
- Django の技術仕様を説明する。
- Django 動作を説明する。
- チュートリアルやリファレンスでは無い。
補足(チュートリアルと詳細なドキュメント)
- チュートリアル
はじめての Django アプリ作成、その 1:https://docs.djangoproject.com/ja/5.2/intro/tutorial01/ - 詳細なドキュメント
Django を使う:https://docs.djangoproject.com/ja/5.2/topics/
1.1.1.モデルの設計
・モデルとは
- データベースのテーブルをアプリケーションで扱うためのデータの型のこと。
- モデルは Python のクラスで定義する。
- 各クラス(各モデル)は テーブル に対応する。クラスの属性は テーブルのカラム に対応する。
・Django はデータベース無しでも使用できる。
・Django には ORM (object-relational mapper):OR マッパーが付属している。
・ORM とは
SQL を書かなくてもデータベースのデータを保存・検索・更新・削除できる構文や機能のこと
・データモデル構文
データモデル構文は、テーブルのカラムと動作を Python のクラスで記述したもの。
Django でデータベースを使用するには、データモデル構文を使用する。
- クラスの 属性(フィールド) がテーブルのカラムに対応する。
- クラスの メソッド でそのテーブルに関連する振る舞い(動作)を定義できる。
データモデル構文の詳細は、Django を使う/モデルを参照(https://docs.djangoproject.com/ja/5.2/topics/db/models/)
・データモデル構文の例
from django.db import models
#Reporter(記者)テーブル
class Reporter(models.Model):
full_name = models.CharField(max_length=70) #カラム
def __str__(self):
return self.full_name
#Article(記事)テーブル
class Article(models.Model):
pub_date = models.DateField() #カラム
headline = models.CharField(max_length=200) #カラム
content = models.TextField() #カラム
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE) #カラム
def __str__(self):
return self.headline
1.1.2.モデルのインストール
・モデルのインストールとは
データモデル構文で記述したテーブルのクラス(モデル)をもとに、データベースにテーブルを作成すること。(テーブルやカラムの新規、更新、削除が可能)
makemigrations と migrate という 2 つのコマンドが用意されており、SQLでなくコマンドでテーブルを作成することが出来る。
# マイグレーションファイルを作る
...\> py manage.py makemigrations
# データベースにテーブルを作成
...\> py manage.py migrate
-
makemigrations コマンド
テーブルの作成に使用するファイル(マイグレーションファイル)を作成する。 -
migrate コマンド
マイグレーションファイルを実行し、データベースにテーブルを作成する。
制約の追加などのスキーマを制御する機能も提供します。
・makemigrations コマンドと migrate コマンドの詳細は、API リファレンス/django-admin と manage.py を参照(https://docs.djangoproject.com/ja/5.2/ref/django-admin/)
・スキーマを制御する機能の詳細は、Django を使う/マイグレーションを参照(https://docs.djangoproject.com/ja/5.2/topics/migrations/)
1.1.3.自動生成される API で楽しむ
Django ではモデルを定義する(データモデル構文でテーブルのクラスを作成する)と SQL を書かなくても、Python の API(メソッド) でデータベースへ CRUD 操作などが出来る。
API は、Django を使う/モデルとデータベース/クエリを作成する(https://docs.djangoproject.com/ja/5.2/topics/db/queries/ )を参照してください。
また、はじめての Django アプリ作成、その 2/API で遊んでみる(https://docs.djangoproject.com/ja/5.2/intro/tutorial02/#playing-with-the-api )でも説明されています。
・Python シェルを使用した API の実行例
Django の対話型シェルを起動
py manage.py shell
モデルのインポート
Article(記事)テーブルと Reporter(記者)テーブルを news.models.py ファイルからインポートする
>>> from news.models import Article, Reporter
INSERT 文(データの追加)
Reporter(記者)テーブルへのデータ作成と追加
# Reporterオブジェクト(インスタンス)を作成
>>> r = Reporter(full_name="John Smith")
# Reporterオブジェクトのfull_name属性を表示
>>> r.full_name
>>> 'John Smith'
# INSERT文の発行
>>> r.save()
# INSERTが成功すると自動採番された 主キー(id) が r.id にセットされる。
# 自動採番された主キー(id)の確認
>>> r.id
>>> 1
SELECT 文(データの取得)
all() : 全件取得
>>> Reporter.objects.all()
>>> <QuerySet [<Reporter: John Smith>]>
get(条件) : 条件に一致するレコードを取得
id 指定
>>> Reporter.objects.get(id=1)
>>> <Reporter: John Smith>
データが無いと例外が発生する
>>> Reporter.objects.get(id=2)
>>> Traceback (most recent call last):
...
DoesNotExist: Reporter matching query does not exist.
前方一致検索(**startswith)
full_name カラムを前方一致で取得
>>> Reporter.objects.get(full_name**startswith="John")
>>> <Reporter: John Smith>
部分一致検索(**contains)
full_name カラムを部分一致で取得
>>> Reporter.objects.get(full_name**contains="mith")
>>> <Reporter: John Smith>
INSERT 文
Article(記事)テーブルへのデータ作成と追加
# date クラスのインポート(データ作成のため)
>>> from datetime import date
# Articleオブジェクト(インスタンス)を作成
>>> a = Article(
>>> ... pub_date=date.today(), headline="Django is cool", content="Yeah.", reporter=r
>>> ... )
# INSERT文の発行
>>> a.save()
a は Article オブジェクト(記事)となる。
Article モデルには reporter という 外部キー があり、Reporter モデルと結びついている。
reporter=r で、Article オブジェクトのreporterカラムにReporter オブジェクトを代入して関連づけている。(単に reporter の値を代入しているのではない。)
追加したデータの確認
>>> Article.objects.all()
>>> <QuerySet [<Article: Django is cool>]>
外部キーの利用
a.reporter とすると「a オブジェクトの.reporter 属性に代入された Reporter オブジェクトを返す」という意味になります。
# a オブジェクトの Reporter オブジェクトを返す
>>> r = a.reporter
# Reporterオブジェクト の full_name を参照
>>> r.full_name
>>> 'John Smith'
逆方向のアクセス
Reporter オブジェクトに紐づいている Article オブジェクトを取得できる。
>>> r.article_set.all()
>>> <QuerySet [<Article: Django is cool>]>
SELECT 文(JOIN:テーブルの結合)
Article(記事)テーブルは reporter という 外部キー があり、Reporter(記者)テーブルと結びついている。
reporterfull_namestartswith="John"とすると、Article テーブルと Reporter テーブルを結合し、full_name を前方一致で検索したデータを出力する。
>>> Article.objects.filter(reporter**full_name**startswith="John")
>>> <QuerySet [<Article: Django is cool>]>
UPDATE 文(データの更新)
# Reporter オブジェクトを更新する。
>>> r.full_name = "Billy Goat"
# UPDATE文の発行
>>> r.save()
DELETE 文(データの削除)
# DELETE文の発行
>>> r.delete()
1.1.4.作業場 (scaffold) ではなく完成品 (whole house) の、動的な admin インタフェース
・Django の admin サイトとは(管理サイト)
Django には 管理サイトという Web アプリ形式のデータベースのテーブルを管理する機能がある。
管理サイトにモデル(データモデル構文のテーブルのクラス)を登録すると、テーブルのレコードの作成、表示、更新、削除などが行える。

https://www.w3schools.com/django/django_admin.php
管理インターフェースの詳細は、 API リファレンス/contrib パッケージ/Django の admin サイトを参照(https://docs.djangoproject.com/ja/5.2/ref/contrib/admin/)
・データモデル構文で Article(記事)テーブルを定義する
from django.db import models
#Article(記事)テーブル
class Article(models.Model):
pub_date = models.DateField()
headline = models.CharField(max_length=200)
content = models.TextField()
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
・Article(記事)テーブルを管理サイトに登録
from django.contrib import admin
from . import models
#Article(記事)テーブルを管理サイトに登録
admin.site.register(models.Article)
・Django の管理サイト(Admin)の用途
開発者がデバッグやデータ確認のために使うだけでなく、Web サイトの更新としても使用できる。
例えば、Web サイトやアプリに表示されるコンテンツをテーブルに登録し、管理サイトから更新することで Web サイトの運用をすることができる。
・Django アプリケーションを作成するときの典型的なワークフロー
- モデル(データモデル構文のテーブルのクラス)を作成
- admin サイト(管理サイト)を組み上げて早期に立上げる
- スタッフ (や顧客) がデータを投入できるようにする
- 3 をしてから必要に応じて、管理サイト以外の別のデータを公開・更新する方法を開発する
1.1.5.URL を設計する
・ページルーティングの方法
- Django ではページルーティングを URLconf というモジュールで行う。
- URLconf は URL のパターンと 画面を生成する処理である Python のコールバック関数(ビュー関数やクラスベースビュー)を対応づけることでページを表示させる。
- URLconf により URL と Python のコールバック関数が疎結合に保つ。
URLconf の詳細は、 Django を使う/HTTP リクエストのハンドリング/URL ディスパッチャを参照(https://docs.djangoproject.com/ja/5.2/topics/http/urls/)
URL スキームとは
URL のパターン設計のこと
URL を設計・構造化するかというルールや方針
・ページルーティング(URLconf)の例(Reporter/Article)
from django.urls import path
from . import views
urlpatterns = [
path("articles/<int:year>/", views.year_archive),
path("articles/<int:year>/<int:month>/", views.month_archive),
path("articles/<int:year>/<int:month>/<int:pk>/", views.article_detail),
]
- URL パスと Python のコールバック関数("views")をマッピングすることでルーティングを実現する。
- URL パス文字列は、パラメータタグ(<int:year>などの部分)を使用して値を取得する。
- ページをリクエストすると、urlpatterns の最初に一致したパスから Python の関数("views")を呼び出す。一致しない場合は 404 ビューを呼び出す。
- 各ビューは、リクエストのメタデータを含むリクエストオブジェクトと、パターンで捉えられた値を渡します。
- 例えば、ユーザが "/articles/2005/05/39323/" という URL をリクエストすると、 Django は news.views.article_detail(request, year=2005, month=5, pk=39323) のような関数呼び出しを行います。これにより URL と Python コードを疎結合に保つ。
- パスはロード時に正規表現にコンパイルされる。
1.1.6.ビューの自作
・ビューとは
Django のビューとはリクエストに応じて適切なレスポンスを返す処理である。(単に画面を生成して返す処理ではない)
ビューは関数またはクラスとして定義され、URLconf によって呼び出される。
・ビューの主な役割
- ページを返す
リクエストを受けてページのコンテンツを含む HttpResponse を生成して返す - 例外を返す
存在しないページなら Http404 などの例外を送出する - ページ以外のレスポンスを返す
- JSON や XML を返す API
- ファイルダウンロード (FileResponse)
- リダイレクト (HttpResponseRedirect) など
・ビューのページを返す処理の動作
- パラメーターに従いデータベースからデータを取り出す。
- テンプレートをロードする。
- 取り出したデータでテンプレートを使用して HTML を組み立てレンダリングする。
・ year_archive のビューの例
from django.shortcuts import render
from .models import Article
def year_archive(request, year):
a_list = Article.objects.filter(pub_date__year=year)
context = {"year": year, "article_list": a_list}
return render(request, "news/year_archive.html", context)
この例では Django のテンプレートシステムを使っています。テンプレートシステムの詳細は、Django を使う/テンプレート(https://docs.djangoproject.com/ja/5.2/topics/templates/)
1.1.7.テンプレートを設計する
・テンプレートとは
画面のレイアウトやデザインを記述したもの。
テンプレートにビューからのデータを HTML に埋め込み画面を生成する。
・テンプレートの機能
テンプレートを効率的にロードする仕組みや、重複したテンプレートの作成を省ける機能がある。
-
検索パス(テンプレートのロードの仕組み)
各画面のテンプレートをまとめておくことで、同じファイルをロードせずに済む仕組み。 -
継承(テンプレ―トの再利用の仕組み)
共通のレイアウトや部品を記述した共通のテンプレートから、差分のみを記述した個別のテンプレートを作る機能。
検索パスの「どこからロードするか」と継承の「どう再利用するか」を組み合わせることで、テンプレートの重複を最小化できる。
・Django のテンプレートの例
{% extends "base.html" %}
{% block title %}Articles for {{ year }}{% endblock %}
{% block content %}
<h1>Articles for {{ year }}</h1>
{% for article in article_list %}
<p>{{ article.headline }}</p>
<p>By {{ article.reporter.full_name }}</p>
<p>Published {{ article.pub_date|date:"F j, Y" }}</p>
{% endfor %}
{% endblock %}
・プログラムの説明
-
変数(オブジェクト)の表示
二重の波括弧で囲む{{ 変数(オブジェクト) }}
プログラムの{{ article.headline }}は article の headline という属性の出力している。
ドット表記で辞書の検索や、インデクス指定、関数呼びだしなどを行える。 -
テンプレートフィルター
ビューから渡された値を加工したり、指定の形式に変換して表示する機能。Django ではフィルターと呼ぶ。{{ 変数 | フィルター }}
プログラムの{{ article.pub_date|date:"F j, Y" }}は、 datetime オブジェクトを指定の形式に変換している。
複数のフィルターを連結して指定することもできる。また、フィルターに独自の Python コードを実行するカスタムテンプレートフィルタやカスタムテンプレートタグがある。-
カスタムテンプレートタグの詳細は、 How-to ガイド/独自のテンプレートタグとフィルタを作る (https://docs.djangoproject.com/ja/5.2/howto/custom-template-tags/ )を参照
-
カスタムテンプレートフィルタの詳細は、 How-to ガイド/独自のテンプレートタグとフィルタを作る/独自のテンプレートフィルタを記述する(https://docs.djangoproject.com/ja/5.2/howto/custom-template-tags/#howto-writing-custom-template-filters )を参照
-
-
テンプレートの継承
{% extends 継承するhtml %}
{% extends "base.html" %}の部分で base.html の継承を宣言している。
継承したベーステンプレートに定義されているブロックの中身を記述する。
・ベーステンプレートの例
{% load static %}
<html lang="en">
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<img src="{% static 'images/sitelogo.png' %}" alt="Logo" />
{% block content %}{% endblock %}
</body>
</html>
静的ファイルの配信(How-to ガイド/プロジェクトの設定と管理/静的ファイル (画像、JavaScript、CSS など) を管理する
(https://docs.djangoproject.com/ja/5.2/howto/static-files/)
・必ず Django のテンプレートシステムを使う必要はない
1.1.8.これらはほんの一部にすぎません
・その他の便利機能
Django の概要で紹介したのは、全体の一部分であり他にもまだまだ便利な機能を備えている。
-
memcached などのバックエンドを組み込んだ キャッシュフレームワーク 。
(Django を使う/Django のキャッシュフレームワーク(https://docs.djangoproject.com/ja/5.2/topics/cache/ )) -
Python の小さなクラスを書くことで RSS や Atom フィードを作成できる 配信 (syndication) フレームワーク 。
(API リファレンス/contrib パッケージ/配信 (syndication) フィード フレームワーク(https://docs.djangoproject.com/ja/5.2/ref/contrib/syndication/ )) -
自動生成される admin(管理サイト) の魅力的な機能の数々。
・次のステップ
- Django をダウンロードする。
- チュートリアルを実施する。
さぁ始めましょう/はじめての Django アプリ作成、その 1
(https://docs.djangoproject.com/ja/5.2/intro/tutorial01/) - コミュニティに参加する。