既存システムの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