Djangoでデータベースにレコード登録する時に起こったエラー対応

Django
スポンサーリンク

PythonとDjango3を使ってデータベース(sqlite3)にレコード登録を試すコードを実行した時にエラーが起こってデータが登録できない状況に奮闘したのでメモしておきます。

Djangoの使い方などは、このブログではまだ書いていなかったと思いますので、そのあたりはまた別にやりましょう。ここではあくまでも奮闘メモとして残しておきます。

スポンサーリンク

DB登録時に発生したエラー

とりあえず、データベース登録時に発生したエラーを記載しておきましょう。次のエラーがターミナルに表示されました。

django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

コード自体は何度見返しても打ち間違いなどはありませんでした。それなのにこのエラー表示。

一体、何が起こったのでしょうか?

スポンサーリンク

データ登録時のコード

データ登録時のコードは、次のようなコードでした。

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ModelProject.settings')
from django import setup
setup()
from ModelApp.models import Person

p = Person(
    first_name="Sae", last_name="Okazaki",
    birthday="1995-11-02", email="test@example.com",
    memo="オールドルーキー 真崎かほり役", web_site="https://t-tribe.co.jp/artist/sae-okazaki"
)

p.save()

コードのデータは適当です。岡崎紗絵ちゃんが最近お気に入りなのでちょっと使ってみました。

別ファイルにデータのmodelを設定して読み込んで、データ登録を実行しているという形です。

ここで上記のエラーが表示されました。

ただし、実を言うと、実際はこのコードではなかったのでした。ちょっとした VScodeの設定の悪戯にあっていたのが原因とわかりました。

スポンサーリンク

エラーの原因はコードの自動整形

エラーを読むと、「設定にアクセスする前に、環境変数 DJANGO_SETTINGS_MODULE を定義するか、settings.configure() を呼び出す必要があります」というような表現があります。

そこで、自分のコードを見てみると、上記のコードが次のようになっていることに気がつきました。

from ModelApp.models import Person
from django import setup
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ModelProject.settings')
setup()

VScodeのファイルの保存に、format on save を設定しているので、コードが自動整形されて順番が入れ替わっているのでした。Pythonの環境にはautopep8をインストールしているので、その形式によってコードが整形されていることになります。

このコード整形がエラーの原因でした。自動整形の設定をOFFにすれば問題は解決するのですが、それだと他の部分のコーディングの時に楽ができません。

では、どうするか?

スポンサーリンク

対応:コード整形したくない部分を # fmt: off と # fmt: on で囲む

VScodeのファイル保存時に自動整形させたくない場合は、整形したくない部分を # fmt: off  と # fmt: on で囲むことで、自動整形を無視することができます。

ですから、最初のコードは次のようにすれば良いことになります。

# fmt: off
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ModelProject.settings')
from django import setup
setup()
from ModelApp.models import Person
# fmt: on

p = Person(
    first_name="Sae", last_name="Okazaki",
    birthday="1995-11-02", email="test@example.com",
    memo="オールドルーキー 真崎かほり役", web_site="https://t-tribe.co.jp/artist/sae-okazaki"
)

p.save()

こうすることで、ファイルを保存すれば該当部分は整形されずに済みます。

コードを実行すると無事にDBにレコードを登録することができました。

スポンサーリンク

まとめ

コードの自動整形は便利ですが、コードのロジックによっては整形しない方が良い場合があります。

VScodeのPythonファイル保存時の自動整形を無視したい場合は、その該当部分のコードを # fmt: off  と # fmt: on で囲むことで、そこの部分はそのままのコードで保存することができます。

タイトルとURLをコピーしました