目次
こんにちわ! 管理人のsinyです。
この記事はDjango入門者向けのチュートリアルです。
Django入門者向けにDjango開発を始めるにあたって必要となるタスク全般の基礎知識についてまとめました。
一般的なチュートリアル記事より手順を詳細に記載していますので、この記事を通じてDjangoに関わる人が一人でも増えたら幸いです!
また、Django入門者向けのチュートリアルノートも配信していますので、こちらもぜひチェックしてみてください。
特に初心者の方で、本記事の内容について質問がありましたら、問合せフォーム、またはTwitterから受け付けていますのでお気軽にどうぞ。
Django開発環境について(2019年3月17日更新)
本チュートリアルでは、以下の環境でDjangoを開発することを前提に記載しています。
区分 | バージョン |
OS | Windows10 |
Python | 3.6.5 |
Django | 2.1.7 |
※上記とは違う環境(ubuntu,Linuxなど)では細かい実行コマンド手順が異なります
Anaccondaの導入がまだの方は、下記の記事を参考にして最初にAanacondaを導入してください。
仮想環境の作成
Djangoの開発を進めていくと様々なライブラリーを利用することになりますが、開発案件毎に
異なるバージョンを利用したいというニーズが出てきます。
Aシステム開発ではDajngo1.6を使っているけ
ど新規B案件ではDjango2.0を利用したい!
そんな時は仮想環境を利用すればいいですよ!
ローカルPC環境内に仮想環境を作成することで、
開発プロジェクト毎に独立した開発環境を準備
することができます。
開発環境の作成は非常に簡単です。
WindowsのMS-DOS画面を起動したら、以下のコマンドを実行してください。
mkdir c:\django\venv cd c:\django\venv python -m venv tutorial
・2行目で作成したvenvフォルダに移動します。
・3行目の「python -m venv [仮想環境名]」コマンドで仮想環境を作成します。
※今回は、[tutorial]という仮想環境名を作成しています。
.\tutorial\Scripts\activate
すると、以下のように(仮想環境名) c:\django\venvという表示に変わります。
「.\[仮想環境名]\Scripts\activate」
deactivate
②仮想環境の有効化コマンドは「[仮想環境名]\Scripts\activate」
③仮想環境の無効化は「deactivate」
Djangoモジュールのインポート
Djangoで開発するためには、必要に応じてモジュールをインストールする必要があります。
モジュールのインストールはPythonのパッケージ管理システム(pipコマンド)を使って行います。
モジュールのインポート(通常の場合)
まず最初に、pipコマンド自体を最新バージョンにアップデートします。
仮想環境を有効化した状態で、以下のコマンドを実行します。
python -m pip install --upgrade pip
「Successfully installed pip-xx.x」というメッセージが表示されたことを確認します。
それでは、続いてDjango本体のインストールを行います。
今回はDjangoのバージョン2.0.6を導入します。
以下のコマンドを実行してください。
pip install django==2.0.6
モジュールのインストールは「pip install [モジュール名]==[バージョン] 」という形式で実行します。
「Successfully installed django-2.0.6」というメッセージが表示されたことを確認します。
つづいてdjangoがインストールされているか確認してみましょう。
インストールされているモジュールを確認するには[pip list]コマンドを実行します。
(tutorial) c:\django\venv;pip list Package Version ---------- ------- Django 2.0.6 pip 18.1 pytz 2018.7 setuptools 39.0.1
Package列にモジュール名、Version列にバージョンが表示されます。
上記4行目を見るとバージョン2.0.6のDjangoがインストールされていることが確認できます。
モジュールのインポート(Proxy環境の場合)
個人開発のケースではあまり問題にならないと思いますが、社内ネットワーク環境下でモジュールのインポートを行う場合、大抵のケースでProxyの問題でインポートエラーとなります。
Proxy環境下でpip installコマンドを実行する場合は以下の形式でコマンドを実行する必要があります。
pip install [モジュール名] --proxy [プロキシアドレス]:[ポート番号]
以下は具体例です。
pip install django==2.0.6 --proxy http://10.155.3.123:80
Proxy環境下でモジュールをインポートする度に毎回proxyオプションを指定するのは結構面倒くさいので、以下の設定を一度行っておくと便利です。
①Anacondaのルートフォルダに.condarcファイルを作成します。
②作成した.condarcファイルを開いて以下を記述して保存します。
proxy_servers: http: http://[プロキシアドレス]:[ポート番号] https: https://[プロキシアドレス]:[ポート番号]
以上でモジュールのインポート手順の説明は終わりです。
②pip install [モジュール名]=[バージョン] ※バージョン指定する場合
③pip install [モジュール名] --proxy[プロキシアドレス]:[ポート番号] ※Proxy環境の場合
Djangoプロジェクトの作成
Djangoでは「プロジェクト」と「アプリケーション」という2階層で構成されています。
開発するシステムに対して1つのプロジェクト(単なるフォルダ)というものを作成します。
そして、プロジェクト(フォルダ)の配下にアプリケーションを作成するという流れになります。
プロジェクトは開発するシステムに対して1つだけ作成し、1つのプロジェクトに対して複数のアプリケーションを作成することができます。
アプリケーションはどのような単位
で作成するのでしょうか?
アプリケーションは機能ごとに作成するイメージです。
例えば・・・
アプリケーション①:ユーザ管理機能
アプリケーション②:在庫管理機能
アプリケーション③:受発注管理機能
といったイメージです。
実際の開発は、アプリケーションフォルダ内にpythonのコードファイル(拡張子が.py)を作成して
コーディングしていくことになります。
それでは、プロジェクトの作成に進みましょう。
プロジェクトの作成は以下のコマンドで行います。
django-admin startproject [プロジェクト名]
cd c:\django django-admin startproject tutorial
・2行目でtutorialというプロジェクトを作成します。
開発サーバの起動
WEBアプリケーションを構築するためにはIIS、Apache、TomcatといったWEBサーバを立てる必要がありますが、DjangoではそうしたWEBサーバを構築しなくてもローカルPC上で簡単に疑似的なWEBサーバを起動させることができます。
それでは、開発サーバを起動させてみましょう!
以下のコマンドを実行してください。
cd c:\django\tutorial python manage.py runserver
・2行目で開発サーバを起動します。
http://127.0.0.1:8000/にアクセスして以下の画面が表示されればOKです!
以下のように最後にポート番号をしていすると開発サーバで利用されるポート番号を任意に指定することができます。
言語設定(英語⇒日本語)
言語を変更するにはdjangoのsettings.pyというファイル内のパラメータを変更します。
まず、以下のフォルダにあるsettngs.pyを開きます。
C:\django\tutorial\tutorial\settings.py
LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC'
LANGUAGE_CODE = 'ja' TIME_ZONE = 'Asia/Tokyo'
ブラウザを更新して以下の通り日本語になればOKです!
データベースの設定
この記事内ではデフォルトで設定されているファイルベースデータベース(SQlite)を使いますので、今回は特別な設定は不要です。
接続するデータベースの種類によって、若干設定内容が異なってきます。
参考にsqliteとMySQLを使った場合のDB接続の設定例を以下に記載します。
sqliteの場合
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
'ENGINE'の部分で利用するデータベースの種類を指定します。
’NAME'の部分でデータベースファイルの場所を指定しています。
MySQLの場合
データベースにMySQLを利用する場合は、以下のような設定になります。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'データベース名', 'USER': 'DB接続ユーザ名', 'PASSWORD': 'パスワード', 'HOST': 'dbサーバ名', 'OPTIONS': { 'charset': 'utf8mb4', }, } }
接続するデータベースはあらかじめ作成しておく必要があります。
また、OPTIONSとしてデータベースのcharasetを指定することができます。
Djangoアプリケーションの作成
webシステムを開発するためにはDjangoのアプリケーションを作成する必要があります。
今回は、家計簿アプリを作成するという前提で「kakeibo」という名前のアプリケーションを作成します。
DOS画面上で以下のコマンドを実行してください。
(実行場所はc:\django\tutorial)
python manage.py startapp kakeibo
以下のようにプロジェクト「tutorial」フォルダ直下にアプリケーションのフォルダとファイルが自動生成されます。
モデルの作成
Djangoのモデル(M)ではテーブルの情報(主キー、データ長、データ型など)を定義していきます。
Djangoでは、直接SQL分を実行してデータベースへテーブルを作成するのではなく、事前にモデル(models.py)にテーブルの情報を定義しておき、「マイグレーション」という機能を使って自動でデータベースへ反映してきます。
以下のようなイメージです。
通常データベースへのテーブルの実行はSQL文を直接実行するのですが、Djangoではマイグレーション機能を利用することで事前に定義しておいたテーブル情報を元にSQL分を自動生成した後にデータベースへ反映する処理が実行されます。
それでは、モデルの定義を行っていきます。
まず、以下のファイルを開いてください。
C:\django\tutorial\kakeibo\models.py
from django.db import models # Create your models here.
from django.db import models # Create your models here. class Category(models.Model): class Meta: #テーブル名の指定 db_table ="category" #カラム名の定義 category_name = models.CharField(max_length=255,unique=True)
Djangoではテーブルの定義をPythonのクラスとして定義していきます。
クラスを定義する際に、Django標準のmodelsクラスを承継してテーブルのクラス(上記例ではCategory)を定義する形になります。
まず1行目の以下のコードでDjango標準のmodelsクラスをインポートしています。
from django.db import models
そして、3行目の以下の部分でDjango標準のmodelsクラスを承継してカテゴリテーブル用のクラス「Category」を定義しています。
class Category(models.Model):
次に、定義したCategoryクラスの中にさらに「Meta」という名称でクラスを定義し、Metaクラス内にテーブル名を指定していきます。
テーブル名の指定は、「db_table = "テーブル名"」という形で指定します。
class Meta: #テーブル名の指定 db_table ="category"
なぜMetaクラス内にdb_tableを定義するかと思った方もいると思います。
これはDjangoの仕様でテーブル名やこの後出てくるverbose_name (表示名の単数形)と verbose_name_plural(表示名の複数形)はMetaクラス内に定義するルールになっているからですので、あまり深いことは考えなくていいです。
最後に、テーブル項目をCategoryクラスのクラス属性として定義していきます。
今回は、カテゴリテーブルの項目として「カテゴリ名」だけ定義しますので、以下の部分でカテゴリ名を定義しています。
category_name = models.CharField(max_length=255,unique=True)
<項目名> = models.<データ型>(フィールドオプション)
まずはデータ型ですが、これは文字通りカラムのデータ型を指定します。
データ型には様々なものがありますが、基本的なものを以下にまとめました。
文字列型は「交通費」、「家賃」といった文字をカラムのデータとして利用する場合に指定します。
数値型は「金額」のような数字を項目にしたい場合に指定します。
日付型は「2018年11月」のような日付型を指定する場合に指定します。
続いてフィールドオプションです。
フィールドオプション部分には、テーブル項目に対する属性を定義していきます。
具体的には以下のような属性があります。
max_length / unique / default / verbose_name
さて、もう一度カテゴリテーブルのカラム名「カテゴリ」の定義をもう一度見てみましょう。
↓ ↓ ↓
<項目> = models.<文字列型>(最大サイズ=255, ユニーク属性あり)
↓ ↓ ↓ ↓
category_name = models.CharField(max_length=255,unique=True)
こんな感じでテーブルの項目を必要に応じて定義しています。
※ちなみにunique=Trueとすることで重複した値を登録できなくなります。
このチュートリアル記事では以下2つのテーブルを定義していきます。
①カテゴリテーブル(カテゴリの種類を格納するためのテーブル)
②家計簿テーブル(家計簿のデータを格納するテーブル)
ここで1つ抑えていただきたいポイントがあります。
「テーブルのリレーション」についてです。
テーブルのリレーション
複数テーブル間でモデルを構成するにはリレーションを定義する必要があります。
リレーションには3種類(一対一、一対多、多対多)がありますが、ここでは一番よく利用する「一対多」について説明します。
今回の家計簿アプリの例で説明しますね。
上図のようにカテゴリテーブルのある1レコード(食費)に対して複数のレコード(家計簿データ)が関連づけられています。
一方、家計簿テーブル上の1レコードは必ず1つのカテゴリ名に紐づいています。
このようなテーブル間の関係を「一対多」といいます。
Djangoでは「一対多」のリレーションを設定する場合に「多側」に
「外部キー」というものを定義します。
今回のチュートリアルでは、家計簿テーブルにカテゴリテーブルを参照する外部キーをつけます。(以下のイメージです)
改めて、全体のテーブル構成を見てみましょう。
「多側」である「家計簿テーブル」に「カテゴリテーブル」を参照する
「外部キー」を設定することで、テーブル間のリレーションを設定します。
実際のコーディングにおいてDjangoのモデルでは「多」側のモデルに「ForeignKey」フィールドを持たせることでリレーションを実現できます。
それでは、新たに家計簿テーブルを定義して、カテゴリテーブルとの間にリレーションを設定してみましょう。
models.pyに以下のコードを追加してください。
class Kakeibo(models.Model): class Meta: #テーブル名 db_table ="kakeibo" #カラムの定義 date = models.DateField(verbose_name="日付",default=datetime.now) category = models.ForeignKey(Category, on_delete = models.PROTECT, verbose_name="カテゴリ") money = models.IntegerField(verbose_name="金額", help_text="単位は日本円") memo = models.CharField(verbose_name="メモ", max_length=500)
家計簿テーブルの定義もカテゴリテーブル同様にPythonのクラスとして定義していきます。
以下で、models.Modelを承継して「Kakeibo」という名称で家計簿テーブルクラスを定義し、
class Kakeibo(models.Model):
Metaクラスのクラス属性としてテーブル名「db_table = "kakeibo"」を定義します。
class Meta: #テーブル名 db_table ="kakeibo"
#カラムの定義 date = models.DateField(verbose_name="日付",default=datetime.now) category = models.ForeignKey(Category, on_delete = models.PROTECT, verbose_name="カテゴリ") money = models.IntegerField(verbose_name="金額", help_text="単位は日本円") memo = models.CharField(verbose_name="メモ", max_length=500)
今回は上記の通り、「日付、カテゴリ名、金額、メモ」を表すカラムを定義しました。
まず「日付」ですが、Date型を使うには以下のコマンドを実行してdatetimeメソッドをインポートしておく必要があるので、models.pyの最初ほうに追加します。
from django.db import models from datetime import datetime #追加する
づいてカラム「日付」を以下で定義しています。
date = models.DateField(verbose_name="日付",default=datetime.now)
データ型に日付型「DateFileld」、
フィールドオプションに項目名の説明「verbose_name="日付"」を定義、
デフォルトの設定値として現在日付(datetime.now)を指定しています。
1つ飛ばして「金額」は以下の通り、
money = models.IntegerField(verbose_name="金額", help_text="単位は日本円")
データ型に数値型「IntegerField」を指定、
フィールドオプションに項目名の説明「verbose_name="金額"」を定義し、「help_text="単位は日本円"」を設定しています。
ここで新しく出てきたフィールドオプション「help_text」は、フィールドに補助的な説明を表示させる際に便利です。
※以下のようなイメージ(赤枠がhelp_textで指定した内容)
最後に以下コードで、カテゴリテーブルを参照する外部キーを設定します。
category = models.ForeignKey(Category, on_delete = models.PROTECT, verbose_name="カテゴリ")
[項目名] = models.ForeignKey([参照先 , on_delete = [オプション] ,[その他のフィールドオプション) ↓ ↓ ↓ ↓ category = models.ForeignKey(Category, on_delete = models.PROTECT, verbose_name="カテゴリ")
ここで新しく「on_delete」オプションというものが出てきました。
これは、Djangoバージョン2.0から必須となったオプションで、参照するオブジェクトが削除されたときに、それと紐づけられたオブジェクトも一緒に削除するかどうかを設定するものです。
以下のような種類があります。
いろいろありますが、今回は参照されているものがある場合に誤って削除されないようにPROTECT(保護する)を設定しています。
このチュートリアルの例で説明すると、PROTECTを設定すると削除しようとしたカテゴリ名「交通費」に際に紐づいた家計簿データが存在すると以下のようにカテゴリを削除できなくなります。
この例でカテゴリ「交通費」を削除するには、まず家計簿テーブル側で交通費に紐づいているレコードを削除する必要があるわけです。
ここまでで、カテゴリテーブルと家計簿テーブルの基本的なテーブル定義が完了しました。
完成したコードは以下のようになります。
from django.db import models from datetime import datetime class Category(models.Model): class Meta: #テーブル名 db_table ="category" #カラム名の定義 category_name = models.CharField(max_length=255,unique=True) class Kakeibo(models.Model): class Meta: #テーブル名 db_table ="kakeibo" #カラムの定義 date = models.DateField(verbose_name="日付",default=datetime.now) category = models.ForeignKey(Category, on_delete = models.PROTECT, verbose_name="カテゴリ") money = models.IntegerField(verbose_name="金額", help_text="単位は日本円") memo = models.CharField(verbose_name="メモ", max_length=500)
Djangoマイグレーション
マイグレーションを実行するといいましたが、その前に今回作成したアプリケーション「kakeibo」をsettngs.pyファイルのINSTALLED_APPSというパラメータに追加する必要があります。
C:\django\tutorial\tutorial\settngs.pyを開いて以下の通り追加してください。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'kakeibo', #ここを追加 「最後の「,」を忘れずに! ]
App 'kakeibo' could not be found. Is it in INSTALLED_APPS?
それでは、マイグレーションを実行していきます。
マイグレーションには以下の2ステップあります。
①モデル定義からマイグレーション用のファイルを生成
②マイグレーションファイルに基づいてデータベースへテーブルを作成
まず、以下のコマンドで①(マイグレーションファイルの生成)を実行します。
python manage.py makemirations [アプリケーション名]
python manage.py makemigrations kakeibo
kakeibo\migrations\0001_initial.py
- Create model Category
- Create model Kakeibo
python manage.py migrate
Apply all migrations: admin, auth, contenttypes, kakeibo, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying kakeibo.0001_initial... OK
Applying sessions.0001_initial... OK
以上でテーブルの定義と実装が完了しました!
この記事の続きは、以下のDjangoチュートリアルNote記事で学ぶことができますのでチェックしてみてください。
Djangoで毎月の出費を分析できる家計簿アプリをつくろう!【基礎編】
この記事が良かったと思う方はTwitterフォロー(shiny)とリツイート頂けると嬉しいです!