手元のTODOリスト見たら、確定申告で使ってるdjangoで作ったアプリケーションで グラフ表示 が一部の処理でできてへんこと思い出した。

django6

真っ黒で画像の左上にちぎれたアイコンがあってめっちゃヤな表示。

aws sap-c02の勉強 してる途中で2026年の春に気づいた。

集計結果の一覧の下の方に表示させてるから、いつから表示できんようになったかはわからん。

目安として表示させてる内容やから実務には影響ないんやけど、表示できてへんのは気持ち悪い。

状態表示用の円グラフ表示はちゃんと見えてるから、描画に使うmatplotlibやなくて元データを配列に入れてるところがアカンっぽい。

エラー追いかけるの面倒くさそう・・・。

ここ で軽くdjangoのリリース状況を確認した。

django6

django6は去年の暮れに出てるの知ってたし、1回だけバージョンアップ試したことがあった。

その時はmariadbへの接続がどうしてもできんかったから、いったん断念。

メジャーバージョンが出てすぐに上げてくんやなくて、x.1が出たら修正するのがええ。

今回は先週の8月5日に出てた。

調査とdjango6へのバージョンアップやってみよか。

円グラフ表示してくれや

dockerコンテナで動くdjangoは、稼働ステータスを確認する画面にグラフ表示させてる。

円グラフそのものは表示できとるから、問題は元のデータってことやな。

django6

円グラフ表示できなくなった原因

djangoのモジュールは定期的にバージョンアップしてる。

いじれない期間は、django本体を5.2.9で維持しといて他のモジュールだけをできる範囲でアップデートしてた。

1
pip3 list -o | egrep -v "5.2.9" | tail -n +3 | awk '{ print $1 }' | xargs pip3 install --upgrade

その間にコソっとグラフが表示できんようになって、それを見落としてたんやな。

gemini先生に相談

djangoのソースはデカい。円グラフのこと書いた箇所もどこやったかなってすぐには思い出せん。

個人開発利用やし設計書あるわけやないので、URLにあるモジュール名とコメント行見ながら追いかける。

円グラフ描画と配列に値入れてる場所を特定できたら、その定義箇所のソースを貼り付けて相談。

問題点を探る

聞いてみましょ。

djangoのviewにある定義をそのまま貼り付けて質問してみる。

さっきの真っ黒画面のハードコピーもドラッグする。

■相談
1
2
3
4
5
6
7
以下のsetPltというDjangoの定義を使って円グラフを描いているが、
ブラウザでログインして表示させると添付画像のように真っ黒になってしまっている。
:(中略)
## グラフ表示を実行するビュー関数
@login_required
def get_ENpng(request,year):
:(中略)

秒で答えが戻る。3つの原因を提示してくれとるけど、稼働ステータス画面の円グラフとフォントは表示できてるから2つ目と3つ目はありえへん。

■回答
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
原因1:setPlt 内での計算処理エラー(最有力)
setPlt 内の以下の処理で、データ型や配列の要素数不足による例外(ValueError や IndexError)が発生し、
画像が生成される前に except ブロックへ飛んでいる可能性が高いです。

total = int(values[0]) + int(values[1]) + ... + int(float(values[9]))

原因2:HTMLテンプレート側の <img> タグの指定ミス
:(中略)

原因3:日本語フォント(IPAexGothic)の未インストール
:(中略)

原因1を突き詰めてくことにする。

モジュール更新の影響か?

まともにソースを書いたのはもうずっと前。python書き換えについてgemini先生に相談してみる。

■相談
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
view.pyを変える前に相談したい。
このソースはdjango3.2の頃から利用していて、django5.2ぐらいから表示されなくなった。

以下が現在のrequirements.txtだが、
変数の型やモジュールのバージョンアップ影響で表示されなくなることがあるか。

asgiref==3.11.1
contourpy==1.3.3
cycler==0.12.1
Django==5.2.9
django-ipware==7.0.1
:(中略)
wkhtmltopdf==0.2
zipp==4.1.0

これも秒で答えが戻る。

■回答
 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
結論からお伝えすると、モジュールのバージョンアップによる影響の可能性が極めて高いです。
特にDjango 3.2からDjango 5.2へのメジャーアップデートと、
NumPy 2.x、Matplotlib 3.xの最新版への移行が組み合わさったことで、
既存のコードが破壊されている可能性が高いポイントが2点あります。
:(中略)

提示されているコードでは、データベースや関数から取得したリストを 
q = np.array(motoire) や np.array(p) のように np.array() に変換しています。

Django 3.2時代(NumPy 1.x系)では
ゆるく処理されていた型変換(int や float への暗黙のキャスト)が、
NumPy 2.5.0 では 文字列(str)型として保持される、
または 型不一致で np.sum() や float() 時に TypeError / ValueError を
投げる ようになっている可能性があります。

これにより、get_ENpng 内で内部エラーが発生し、
画像を描画できずに例外へ飛んでいると考えられます。
:(中略)

引数の型チェック追加: ax.pie(values, ...) に渡す values(値の配列)に、
以前は文字列混在でも動いていたものが、
厳格に数値型(int / float)であることを要求されるようになりました。
:(中略)

描画時の文字・注釈処理: ax.annotate() や ax.set_title() の引数計算で、
values[9] などから算出した値に型エラー(str と float の計算など)があると、
画像生成処理(plt.savefig)そのものが失敗します。
:(中略)

出力されているログ(gv_logwrite のログファイル等)を確認してください。

ライブラリが更新されて型の扱い方が厳密になったんやな。

jpcertはたまに見てるけど、pythonのモジュール動向はあんまり意識してへんしなぁ・・・。

ログのことを教えてもらったところで、そうや、思い出した!

exceptionあったとき ログ出力 してるし、検索の画面処理作っとったんやった!!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
## グラフ表示を実行するビュー関数
try:
  ## 科目単位高額TOP10を取ってくる
  p = gv_Func_KamokuTop10(str(year),request)
:(中略
  ## グラフをリセットしてから画像を返す
  plt.cla()
  response = HttpResponse(png, content_type='image/png')

  return response

except Exception as e:

    ## グラフ表示するまでにエラーが発生したらログに書き出す
    key = year
    gv_logwrite('error',request,'dj-グラフ描画','key=(' + str(key) + ')' + 'exeption={' + str(e) + '}')

python書いてるとき、ログ出力の関数作ってデータベースに出力してたんやった。

エラーハンドリングしといてよかったな。

エラーの特定

検索画面にエラー内容が出とるやん。

django6

エラーメッセージに「‘str’ and ‘int’」ってあるやん。

gemini先生にエラー内容を伝えてみる。

■相談
1
2
3
エラーハンドリングの「key=(' + str(key) + ')」とある箇所に以下のメッセージがログとして複数出力されている。

key=(2026)exeption={'<' not supported between instances of 'str' and 'int'}

ソース修正してもらう

先生に相談して修正箇所と方法を特定する。

■回答
 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
ログのエラーメッセージから原因が100%特定できました。
:(中略)
Django 5.2やNumPy 2.x/Matplotlibのバージョンアップに伴い、
データベースからの値の取得結果や np.array の型推論の厳格化が行われたため、
以前は暗黙的に処理されていた数値データが「文字列型(str)」のまま ax.pie() や 
setPlt() 内の処理に渡されていることが直接の原因です。
:(中略)
Matplotlib内部(または ax.pie の処理内部)で値を比較(ソートや描画計算)する際、
str と int が混ざっているため、画像を1枚も作成できずに例外(500エラー相当)となり、
ブラウザ側では「壊れた画像(黒枠・壊れた画像アイコン)」として表示されています。
:(中略)
if len(p) > 1:
    chart_item = p[0,0:10]
    values = p[1,0:10]
else:
    chart_item = p[0,0:1]
    values = p[1,0:1]

# --- ここから追加 ---
# values 内の要素をすべて数値型(float)に変換する
values = [float(v) for v in values]
# --- ここまで追加 ---

## グラフ要素をセットしてpng化
setPlt(chart_item, values)

このように values を数値型のリストに整えてから setPlt へ渡すことで、
str と int の比較エラーが消え、円グラフが正常に描画・表示されるようになります。
一度この1行を追加して表示されるか試してみてください。

とりあえず「ここから追加」ってある箇所を使って型をfloatに変換してみよか。

円グラフ表示復活

ソース修正したらdockerコンテナを再起動。

やっとまともにグラフ表示できた。

django6

小数点以下のある計算してるんやから、そりゃ型はfloatに変換必要やな。

gemini先生に問題箇所の特定を依頼するように質問すると、gemini先生が回答に自信がある時「100%特定できました」って言う。

間違ってても100%って表現使ってくれることあるから、実務やったらちゃんと自分で裏付け取りながらやってく。

djangoそのものをバージョン上げる

djangoを5で歯止めしてたのを、pip3でモジュールのバージョンを上げて6にしてく。

gemini先生に相談してみる。

■相談
1
2
3
4
円グラフ表示できるようになった。ここから以下のコマンドラインを使ってバージョンをdjango6に上げたいが問題あるか。

pip3 list -o | tail -n +3 | awk '{ print $1 }' | xargs pip3 install --upgrade
pip3 freeze > requirements.txt

すぐに答えが戻る。

■回答
 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
結論から言うと、提示されたコマンドを使っていきなり 
Django 6系へ一括メジャーアップデート(全パッケージの最新化)を
行うのは非常に危険で、トラブルの原因になります。
:(中略)
本番環境や既存の開発環境で直接更新するのではなく、
以下の手順を踏むことを強くおすすめします。
:(中略)
Step 1: Django の非推奨警告(DeprecationWarning)を出して確認する
python3 -Wd manage.py runserver
:(中略)
Step 2: 別環境(Python 仮想環境など)を立ち上げて段階的に更新する
:(中略)
# テスト用の仮想環境を作成して有効化
python3 -m venv venv_django6
source venv_django6/bin/activate

# まず Django だけを 6 系に上げる
pip install "Django>=6.0,<7.0"

# その他の依存パッケージを現在の requirements.txt から入れる
pip install -r requirements.txt
:(中略)
Step 3: 動かなくなったパッケージだけを個別に更新する
# 例: 特定のパッケージだけを個別更新
pip install --upgrade django-widget-tweaks

正論やとは思うけど、dockerのコンテナで動かしてるんやし、やり直しはいくらでもできる。

気合い一発、バージョン上げたるか。

けど、manage.pyを指定して非推奨警告(DeprecationWarning)を確認ってのができるのは知らんかったな。

やってみて結果を相談してみよか。

■相談
 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
今回のpython処理はdockerコンテナとして稼働している。以下のようにstep1確認したがバージョンアップすることに問題あるか。

nari@nafslinux-ubu26:/docker$ docker compose exec sv_django bash ⭐️dockerコンテナにログイン

bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)

root@svdjango:/# cd /code/app ⭐️manage.pyがある階層に移動

root@svdjango:/code/app# python3 -Wd manage.py runserver ⭐️非推奨警告(DeprecationWarning)を確認

/usr/local/lib/python3.13/site-packages/django/db/backends/utils.py:98: RuntimeWarning: Accessing the database during app initialization is discouraged. To fix this warning, avoid executing queries in AppConfig.ready() or when your app modules are imported.

  warnings.warn(self.APPS_NOT_READY_WARNING_MSG, category=RuntimeWarning)

/usr/local/lib/python3.13/site-packages/django/db/backends/utils.py:98: RuntimeWarning: Accessing the database during app initialization is discouraged. To fix this warning, avoid executing queries in AppConfig.ready() or when your app modules are imported.

  warnings.warn(self.APPS_NOT_READY_WARNING_MSG, category=RuntimeWarning)

Watching for file changes with StatReloader

Performing system checks...

System check identified no issues (0 silenced).

August 09, 2026 - 06:44:49

Django version 5.2.9, using settings 'website.settings'

Starting development server at http://127.0.0.1:8000/

Quit the server with CONTROL-C.

WARNING: This is a development server. Do not use it in a production setting. Use a production WSGI or ASGI server instead.

For more information on production servers see: https://docs.djangoproject.com/en/5.2/howto/deployment/

長いリストやな。なんとなく大丈夫そうに見える。

ctrl+cで停止して、出力された結果をgemini先生に相談してみた。

■回答
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
ログを確認しました。結論からお伝えすると、Django 6 系へのアップデートに向けて
「非常に良い状態(クリアな状態)」です。
:(中略)
ログの診断結果
:(中略)
1. RemovedInDjango60Warning がゼロ
:(中略)
2. 出力された RuntimeWarning について
:(中略)
これは以前から存在する一般的な警告であり、
Django 6 へのアップデートを直接妨げる致命的なエラーではありません。
:(中略)

よーし。ええ状態って言うてくれてるし、これでアップデートしても大丈夫みたいやで。

実行結果のログとかをgemini先生に読み込んでもらうと、結果も確認してくれるんやな。

6.1でええんか

6.2まで待ってもええんやけど、来年の春まで登場せえへんらしい。

■相談
1
django6ltsはいつ頃発表されると予測できるか。
■回答
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
メジャーバージョンの周期:
x.0(メジャーリリース)は2年間隔で登場します。

Django 5.0: 2023年12月
Django 6.0: 2025年12月
Django 7.0: 2027年12月(予定)

LTS(長期サポート版)の出現タイミング:
LTSは「各メジャーバージョンの最後のマイナーバージョン(.2)」が該当します。

8ヶ月ごとにマイナーバージョンが上がるため、x.2 LTS は
メジャーリリースの約1年4ヶ月後(翌々年の4月)にリリースされます。
:(中略)
バージョン,種別,予定時期
Django 6.0,機能追加版,2025年12月
Django 6.1,機能追加版,2026年8月
Django 6.2 LTS,長期サポート版 (LTS),2027年4月

バージョンアップする

requirements.txtを最初はこう修正したらええらしい。

1
2
3
4
# 修正前
Django==5.2.9
# 修正後(6系の最新を指定)
Django>=6.0,<7.0 ⭐️まだないけど7にはせんといて

実際にバージョン上げる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
root@svdjango:/code/app# pip3 list -o | tail -n +3 | awk '{ print $1 }' | xargs pip3 install --upgrade
Requirement already satisfied: asgiref in /usr/local/lib/python3.13/site-packages (3.11.1)
Collecting asgiref
  Downloading asgiref-3.12.1-py3-none-any.whl.metadata (9.4 kB)
:(中略)
Downloading pip-26.2.1-py3-none-any.whl (1.8 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 82.5 MB/s  0:00:00
Downloading setuptools-84.0.0-py3-none-any.whl (818 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 818.2/818.2 kB 65.4 MB/s  0:00:00
Downloading typing_extensions-4.16.0-py3-none-any.whl (45 kB)
Installing collected packages: typing_extensions, setuptools, pip, pillow, packaging, numpy, Markdown, asgiref, Django, matplotlib
:(中略)
  Attempting uninstall: matplotlib
    Found existing installation: matplotlib 3.11.0
    Uninstalling matplotlib-3.11.0:
      Successfully uninstalled matplotlib-3.11.0
Successfully installed Django-6.1 Markdown-3.10.3 asgiref-3.12.1 matplotlib-3.11.1 numpy-2.5.1 packaging-26.3 pillow-12.3.0 pip-26.2.1 setuptools-84.0.0 typing_extensions-4.16.0
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.
root@svdjango:/code/app# pip3 freeze > requirements.txt 
root@svdjango:/code/app#

比べてみたら、いろいろ上がってた。

django6

状態表示見たら6.1になっとるやん。

django6

状態表示用のグラフ表示もちゃんと表示できたから描画のmatplotlibも使えてる。

django6

djangoのデフォルトの管理画面使えとるな。

djangoの認証情報はmariadbに入っとる。前にdjango6.0出た直後にアップデートしてうまくいかんかったのはこの箇所。

認証情報も読めとるということは、データベースも読めとるしアプリケーションへのログインができるってことで。

django6

動作確認

アプリ確認してく。

母艦のlinuxをUbuntu24から26に変更したし、基本的なところ確認していきましょ。

アプリの改変したときのメモ作ってへんかったから、ここに書いといて次また見ることにしよか。

自動テストあったら楽やのになぁ。

ログイン

できるのが基本。

django6

レコード追加・編集・削除

本番環境はgoogle cloudの中にあるデータを持ってくるから、閲覧環境兼テスト環境のローカルlinuxではデータを好き放題追加・編集・削除してええ。

レコード新規登録。

django6

何もせず「戻る」ってしたり、書き換えて「保存」する。

django6

編集で開いたり行コピーしたり削除したり。

django6

pdfと画像の追加・閲覧

レコードに添付画像つけられる画面は追加して保存したり。

django6

保存した元データ閲覧したり。

django6

資産ページでページネーションできている。

django6

pdfはデータベースにあるblob列から取ってきて、htmlのインラインでビューア表示できとる。

django6

過去帳簿との数字比較(月単位・年単位)

pdf保管している確定帳簿とdjangoで表示した内容の金額が一円単位であってること。

django6

pdf保管している時間計算とパーセンテージがあってること。

django6

5年分ぐらいの金額と時間とパーセンテージがあってたら大丈夫やろ。

その他エラーないか

エラー出力ないこと。これ見落としてたから原因特定できへんかった。普段からたまに見なアカンで。

django6

最後に今期のコミット

ソースに問題ないってわかったら開発環境でコミット。

django6

google cloudのubuntuも26にアップデートせなアカンなぁ。

その上でこのソースを持ってって展開すっかな。