既存システムのDBを使って、Djangoで新たなWebアプリを作っている作業メモ。
1.開発環境と既存DBの取り込み
とりあえず、Visual Studio Community 2019で、既存DBのモデルに取り込みまでは、以下で行った。
2.アプリ開発
チュートリアルを参考に改造していく。
(Django公式)はじめての Django アプリ作成、その 1 | Django ドキュメント
2.1 DBの内容をページに表示
まずは、既存DBのモデルにてデータを取得し、ページに表示する。流れとしては、Viewでmodelを使ってデータを取得し、それをテンプレートに渡して表示させる。
1)ビュー
以下を参考に、モデルを取り込んで、データをテンプレートに渡すようにする。
(Django公式)実際に動作するビューを書く
app/views.pyを修正していく。
①読み込みたいmodelをimport
from .models import DBモデル
②modelを操作してデータを取得
データベース操作について、公式サイトのリンクが以下にまとめてくれてあるので、ありがたく参考にさせてもらう。
(Qiita)Django データベース操作 についてのまとめ
2)テンプレート
app/templates/app以下のテンプレートを修正していく。テンプレートの記述言語についての説明は以下ページ。
(Django公式)
テンプレート
The Django Template Language
Viewから渡されたデータは、「{{ 変数名 }}」と記述して使えるので、それをページ内に表示させる。
2.2 カスタムマネージャーの作成
DB取得等のロジックをViewの中に色々書くのもいまいちなので、カスタムマネージャーを作成する。
(Django公式)マネージャーのカスタマイズ
上記の日本語版は、翻訳が微妙で間違った解釈になるところがあるので、英語版を読んだ方が良さそう。
(Django公式)Custom managers
拡張クラスにメソッドを定義、あるいはget_querysetを書き換える等をコーディングするなり、QuerySetを定義するなりする。以下に4パターンの方法が記載されている。
(Django公式ドキュメント)
①カスタムMangerにメソッド追加する方法
Adding extra manager methods
②カスタムMangerの初期クエリセットを変更する方法
Modifying a manager’s initial QuerySet
③QuerySetを拡張してメソッド追加する方法
Calling custom QuerySet methods from the manager
④QuerySetを複数拡張する場合に、Managerをクエリセットから定義できる方法
Creating a manager with QuerySet methods
上記から適切な方法で実装していく。
1)カスタムマネージャーの定義
app/managers.pyを追加して、カスタムマネージャーを定義する。
"""
Definition of DB managers.
"""
from django.db import models
# Managerの拡張クラスを定義
class XxxxxxManager(models.Manager):
:
データの絞り込みは、filterを使う。
(Django公式ドキュメント)
フィルタを用いて特定のオブジェクトを取得する
フィールドルックアップ
2)モデルの修正
app/models.pyの修正して、モデルのobjectsを書き換える、あるいは目的に応じたmanagerを取得するメソッドと追加する。
3)有効期間内のデータを対象とする例
テーブル(Information)に有効期間として、from_timeとto_timeを持っていて、現在有効なデータだけを対象とする場合の例。「②カスタムMangerの初期クエリセットを変更する方法」で実装。
① manager.py
"""
Definition of DB managers.
"""
from django.db import models
from django.db.models import Q
from django.db.models.functions import Now
# Information
class InformationManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(
Q(from_time__lte=Now()) & Q(to_time__gt=Now()))
filterに、「Q(from_time__lte=Now()) & Q(to_time__gt=Now())」とすることで、「from_time <= CURRENT_TIMESTAMP AND to_time > CURRENT_TIMESTAMP」という条件になる。
(Django公式ドキュメント)
Q オブジェクトを用いた複雑な検索
Now関数
② models.pyの修正
"""
Definition of models.
"""
from django.db import models
from .managers import InformationManager
# Create your models here.
class Information(models.Model):
id_information = models.AutoField(primary_key=True)
from_time = models.DateTimeField(blank=True, null=True)
to_time = models.DateTimeField(blank=True, null=True)
title = models.CharField(max_length=128, blank=True, null=True)
detail = models.TextField(blank=True, null=True)
created_at = models.DateTimeField()
updated_at = models.DateTimeField()
objects = models.Manager() # The default manager.
news = InformationManager() # Custom manager
class Meta:
managed = False
db_table = 'information'
Viewでは、Information.newsで対象データを取得する。
2.3 デバッグ
Django Debug Toolbarを入れる。
Django Debug Toolbar
ドキュメントに従い設定したが、Visual Studio からDjangoの開発用サーバーで実行すると、ツールバーが表示されない。
Chromeのエラーを見ると、toolbar.jsの読み込みがはじかれている。
Failed to load module script: The server responded with a non-JavaScript MIME type of "text/plain".
とりあえず、setting.pyに以下を追加することで解決。
# For Debug Toolbar
if DEBUG:
import mimetypes
mimetypes.add_type("text/javascript", ".js", True)
3.UIデザイン
デザインは苦手なので、Bootstrapのサンプルを参考にする。
https://getbootstrap.jp/docs/4.5/examples/
1)最新のBootstrapを入れる
app/static/app/content,scripts下のBootstarp、JQuery、Popper等の必要なものを入れる。
CDNを利用するのがいいのかもしれないが、とりあえず開発時点ではstaticに取り込む。
2)サンプルのCSS,JSを入れる
使うサンプルのCSS,JSもapp/static/app/content,scripts下に入れる。
3)サンプルを参考にテンプレートを作成していく。
トップページは、Pricingを参考に。管理画面はDashboardを基に作ることにする。
4.セキュリティー設定
1)admin
adminについて、必要ないなら消す。カスタマイズして使っていく予定なら、IP制限を入れる。以下を利用した。
django-admin-ip-restrictor