1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Djangoドキュメント Django の概要 リライト

Last updated at Posted at 2025-10-30

はじめに

本記事は Django の公式ドキュメントのDjango の概要を整理・加筆したものです。
理解しにくい部分を噛み砕いてまとめ直しました。

Django ドキュメント

1.1.Django の概要

Django について

  • 新聞社で開発された
  • Web アプリ開発のフレームワークである
  • Web 開発タスクを迅速かつ簡単化するように設計された

本項の内容

  • データベースを使った Web アプリ開発の概要の説明をする

本項の目的

  • Django の技術仕様を説明する。
  • Django 動作を説明する。
  • チュートリアルやリファレンスでは無い。

補足(チュートリアルと詳細なドキュメント)


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/)

・データモデル構文の例

news/models.py
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(記事)テーブルを定義する

news/models.py
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(記事)テーブルを管理サイトに登録

news/admin.py
from django.contrib import admin
from . import models

#Article(記事)テーブルを管理サイトに登録
admin.site.register(models.Article)

・Django の管理サイト(Admin)の用途

開発者がデバッグやデータ確認のために使うだけでなく、Web サイトの更新としても使用できる。
例えば、Web サイトやアプリに表示されるコンテンツをテーブルに登録し、管理サイトから更新することで Web サイトの運用をすることができる。


・Django アプリケーションを作成するときの典型的なワークフロー

  1. モデル(データモデル構文のテーブルのクラス)を作成
  2. admin サイト(管理サイト)を組み上げて早期に立上げる
  3. スタッフ (や顧客) がデータを投入できるようにする
  4. 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)

news/urls.py

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) など

・ビューのページを返す処理の動作

  1. パラメーターに従いデータベースからデータを取り出す。
  2. テンプレートをロードする。
  3. 取り出したデータでテンプレートを使用して HTML を組み立てレンダリングする。

・ year_archive のビューの例

news/views.py
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 のテンプレートの例

news/templates/news/year_archive.html
{% 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 コードを実行するカスタムテンプレートフィルタやカスタムテンプレートタグがある。

  • テンプレートの継承

    {% extends 継承するhtml %}

{% extends "base.html" %}の部分で base.html の継承を宣言している。
継承したベーステンプレートに定義されているブロックの中身を記述する。

・ベーステンプレートの例

templates/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(管理サイト) の魅力的な機能の数々。


・次のステップ

  1. Django をダウンロードする。
  2. チュートリアルを実施する。
    さぁ始めましょう/はじめての Django アプリ作成、その 1
    (https://docs.djangoproject.com/ja/5.2/intro/tutorial01/)
  3. コミュニティに参加する。
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?