今回はDjangoでWebアプリケーションを作成してみる為に、「モデル設定情報の追加」と「Viewの作成」を行い、ブラウザから接続確認が実施できるところまで行ってみます。
【関連記事】
・DjangoでWebアプリケーションを作成してみる その1(ubuntu18.04、python3.6)
モデルの設定情報の追加
モデルの設定を行うために「job/models.py」の編集を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
from django.db import models from datetime import datetime class Client(models.Model): TOKYO = 13 OOSAKA = 27 FUKUOKA = 40 """ 顧客名 """ client_name = models.CharField(max_length=128) """ 顧客住所(都道府県) """ client_addr1 = models.IntegerField() """ 顧客住所(詳細) """ client_addr2 = models.CharField(max_length=256) """ 顧客連絡先メール """ url = models.EmailField() """ 顧客URL """ email = models.URLField(null=True) """ フィールド作成日 """ created_at = models.DateTimeField(default=datetime.now) """ フィールド更新日 """ updated_at = models.DateTimeField(auto_now=True) class Job(models.Model): """ 顧客 """ client = models.ForeignKey(Client, on_delete=models.CASCADE) """ 顧客仕事タイトル """ title = models.CharField(max_length=256) """ 顧客仕事内容 """ body = models.TextField() """ フィールド作成日 """ created_at = models.DateTimeField(default=datetime.now) """ フィールド更新日 """ updated_at = models.DateTimeField(auto_now=True) class Apply(models.Model): """ 応募ステータスの定数 """ APPLY = 0 # 応募 CONFIRMING = 1 # 確認中 ADOPT = 2 # 採用 NOT_SELECTED = 3 # 不採用 REFUSAL = 20 # 辞退 """ 仕事 """ job = models.ForeignKey(Job, on_delete=models.CASCADE) """ 応募ステータス """ status = models.IntegerField() """ フィールド作成日 """ created_at = models.DateTimeField(default=datetime.now) """ フィールド更新日 """ updated_at = models.DateTimeField(auto_now=True) |
モデルを書くときに主キー(id)は自動で生成されるので明示的に定義する必要はありません。
主キーはレコードが登録されるたびに自動採番(1からインクリメント)されます。
また、外部キーの設定などは以下で行います。
「1:1」のリレーション | 「OneToOneField」をどちらかに設定することで実現できます。 |
「n:1」のリレーション | 「ForeignKey」のフィールドをnの方に持たせることで実現できます。 |
「n:n」のリレーション | 「ManyToManyField」をどちらかにつけることで、自動的に中間テーブルを作成してくれます。 |
尚、Django2系では on_delete のオプションは必須になっています。
設定は以下の6種類があります。
https://docs.djangoproject.com/ja/2.1/ref/models/fields/#arguments
CASCADE | 削除するオブジェクトに紐づいたオブジェクトを全て削除する |
PROTECT | 関連付けられてるオブジェクトがあると削除できない |
SET_NULL | オブジェクトが削除されるとNULLを代わりにセット |
SET_DEFAULT | オブジェクトが削除されるとDefault値を代わりにセット |
SET() | オブジェクトが削除された際の処理を自身で設定 |
DO_NOTHING | 何もしない |
さて、モデルを作成した後はデータベースに反映させる為にマイグレーションを行いますが、初期のマイグレーションの状態は以下のようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ python manage.py showmigrations admin [ ] 0001_initial [ ] 0002_logentry_remove_auto_add [ ] 0003_logentry_add_action_flag_choices auth [ ] 0001_initial [ ] 0002_alter_permission_name_max_length [ ] 0003_alter_user_email_max_length [ ] 0004_alter_user_username_opts [ ] 0005_alter_user_last_login_null [ ] 0006_require_contenttypes_0002 [ ] 0007_alter_validators_add_error_messages [ ] 0008_alter_user_username_max_length [ ] 0009_alter_user_last_name_max_length contenttypes [ ] 0001_initial [ ] 0002_remove_content_type_name sessions [ ] 0001_initial |
それでは、マイグレーションファイルを作成します。
1 2 3 4 5 6 7 8 9 |
$ python manage.py makemigrations Migrations for 'job': job/migrations/0001_initial.py - Create model Apply - Create model Client - Create model Job - Add field job to apply |
引数として最後にアプリケーション名をつけることができます。
アプリケーション名をつけないと全てのアプリのマイグレーションファイルを作成します。
それではマイグレーションを行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$ python manage.py migrate System check identified some issues: WARNINGS: ?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default' HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See: https://docs.djangoproject.com/en/2.1/ref/databases/#mysql-sql-mode Operations to perform: Apply all migrations: admin, auth, contenttypes, job, 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 admin.0003_logentry_add_action_flag_choices... 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 job.0001_initial... OK Applying sessions.0001_initial... OK |
無事、実施できたようなのでマイグレーションの状態を確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$ python manage.py showmigrations admin [X] 0001_initial [X] 0002_logentry_remove_auto_add [X] 0003_logentry_add_action_flag_choices auth [X] 0001_initial [X] 0002_alter_permission_name_max_length [X] 0003_alter_user_email_max_length [X] 0004_alter_user_username_opts [X] 0005_alter_user_last_login_null [X] 0006_require_contenttypes_0002 [X] 0007_alter_validators_add_error_messages [X] 0008_alter_user_username_max_length [X] 0009_alter_user_last_name_max_length contenttypes [X] 0001_initial [X] 0002_remove_content_type_name job [X] 0001_initial sessions [X] 0001_initial |
上記では全てに[X]が設定されていてマイグレーションが実行されているのがわかります。
では、実際のテーブルがどうなっているか、mysqlからテーブルの状態を確認してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
$ sudo mysql -u root -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 47 Server version: 10.1.34-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04 Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> use my_app Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MariaDB [my_app]> show tables; +----------------------------+ | Tables_in_my_app | +----------------------------+ | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | | django_content_type | | django_migrations | | django_session | | job_apply | | job_client | | job_job | +----------------------------+ 13 rows in set (0.00 sec) MariaDB [my_app]> show create table job_client; +------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | job_client | CREATE TABLE `job_client` ( `id` int(11) NOT NULL AUTO_INCREMENT, `client_name` varchar(128) COLLATE utf8mb4_bin NOT NULL, `client_addr1` int(11) NOT NULL, `client_addr2` varchar(256) COLLATE utf8mb4_bin NOT NULL, `url` varchar(254) COLLATE utf8mb4_bin NOT NULL, `email` varchar(200) COLLATE utf8mb4_bin DEFAULT NULL, `created_at` datetime(6) NOT NULL, `updated_at` datetime(6) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin | +------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) MariaDB [my_app]> show create table job_job; +---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | job_job | CREATE TABLE `job_job` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(256) COLLATE utf8mb4_bin NOT NULL, `body` longtext COLLATE utf8mb4_bin NOT NULL, `created_at` datetime(6) NOT NULL, `updated_at` datetime(6) NOT NULL, `client_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `job_job_client_id_8a47c4e6_fk_job_client_id` (`client_id`), CONSTRAINT `job_job_client_id_8a47c4e6_fk_job_client_id` FOREIGN KEY (`client_id`) REFERENCES `job_client` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin | +---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) MariaDB [my_app]> show create table job_apply; +-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | job_apply | CREATE TABLE `job_apply` ( `id` int(11) NOT NULL AUTO_INCREMENT, `status` int(11) NOT NULL, `created_at` datetime(6) NOT NULL, `updated_at` datetime(6) NOT NULL, `job_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `job_apply_job_id_2756580a_fk_job_job_id` (`job_id`), CONSTRAINT `job_apply_job_id_2756580a_fk_job_job_id` FOREIGN KEY (`job_id`) REFERENCES `job_job` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin | +-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) |
jobのアプリでは「アプリ名_モデル名」という名前で3つのテーブルが作成されました。
尚、主なFieldクラスで作成されるMariaDBのカラムの型は以下のようになります。
BooleanField | tinyint(1) |
CharField | varchar |
TextField | longtext |
IntegerField | int(11) |
FloatField | double |
EmailField | varchar(200) |
URLField | varchar(254) |
DateField | date |
DateTime | datetime(6) |
URLFieldとかは下手にリファラーとかを設定すると文字制限を超えてしまいそうですね。
Viewの作成
表示部分の設定をする為にViewの作成をします。
モデルと連動すると大変なのでそこは次回に実施し、まずは簡単なテンプレートでの表示だけを行います。
まず、「config/urls.py」を設定します。
1 2 3 4 5 6 7 8 9 |
from django.contrib import admin from django.urls import include, path urlpatterns = [ path('admin/', admin.site.urls), path('job/', include('job.urls')), ] |
URL設定で「/job/」で始まるURLの設定はJobアプリの「job.urls」に任せてしまっています。
次に「job/urls.py」を新規で作成します。
1 2 3 4 5 6 7 8 9 |
from django.urls import path from . import views app_name = 'job' urlpatterns = [ path('job_list/', views.job_list, name="job_list"), ] |
「app_name = 'job'」で設定していますが、「app_name」の変数は必ず入れましょう。
そして次にビューの作成を行います。
ビューの作成は関数ベースでもクラスでも実施できますが、クラスを使った書き方を行なっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from django.shortcuts import render from django.views import View class JobListView(View): def get(self, request, *args, **kwrgs): context = { 'message': "Hello Word!", } return render(request, 'job_list.html', context) job_list = JobListView.as_view() |
テンプレートの作成
プロジェクトに以下のようなフォルダ構成を作成します。
1 2 3 4 5 |
$ tree job job/ ├── templates |
次に以下のテンプレートを作成します。
1 2 3 4 5 6 7 8 |
<html> <head></head> <body> <h1>{{ message }}</h1> </body> </html> |
こちらで動作の確認を行ってみます。
環境は「runserver」を起動してテストを行います。
1 2 3 |
$ python manage.py runserver 0.0.0.0:8000 |
無事、以下の画面が出力されました。
モデルと全く結びついていないので次はその辺りなど実施してみます。
このブログは株式会社CoLabMixによる技術ブログです。
GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。
Ruby on RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。
開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。