【Django】django.core.exceptions.FieldError: Unknown field(s) () specified for

【Django】django.core.exceptions.FieldError: Unknown field(s) () specified for

【Django】django.core.exceptions.FieldError: Unknown field(s) () specified for

なかなか悩みました。直訳すれば「知らないフィールド操作しようとしてるよ」って事なのです。
でもそこはDjango初心者、怪しい所を見ていても気づかないというね。
と言う事で、今後の為の整理整頓です。

まずエラーが出たらエラー直前の動きを確認する

どういうルートでプログラムが動いたかを確認すれば『修正場所』が解ります。

今回のエラー発生直前の流れはこんな感じでした。

動きを翻訳してみるとこんな感じです。

  1. company/viewsの7行目にあるInquiryFormを調べるため、company/forms.pyを読みに行く。
  2. forms.pyの45行目にあるCompanyCreateFormを読みに行く。
  3. で、読もうとしたらCompanyCreateFormに書いてあるフィールドが無いんですけど…。

と言う事は、怪しいのはテーブル構成を管理してるModelsって事になります。

記載していた誤ったmodels.py と正しいmodels.py

まずは正しいものから。

こちら、間違えていたものです。

NG箇所は各行最後の【 , (カンマ)】。こいつがあったからテーブル構成がおかしくなってたんですね。

マイグレーション用ファイルを作成する

そしてマイグレーション実行。

ん?またエラーが出ました。

NULLを許可してないのに blank=False するなと怒られている?

name = models.CharField(verbose_name=’企業名’, max_length=200, blank=False)

どうやらこいつがNGの様子。Laravelのマイグレーションって空のテーブルを作る形だったから全く意識してなかったけどDjangoではここら辺しっかりしてないとダメみたいです。

1を選択するとPython が起動してゴニョゴニョできます。
2を選択するとマイグレーションが終了します。

You are trying to add a non-nullable field ” to company without a defaultの解決方法

方法は2つです。

  1. blankを外す ※エラーの元となる構成を積み込まない
  2. default値を設定する

defaultを設定する場合、次のように書きます。

defult=’ほげ’ でデフォルトに固定値が入り、null=TrueとするとデフォルトにNULLが設定されます。

デフォルトを構成して python manage.py migrate すればテーブル作成完了です。

郵便番号とか電話番号のバリデーションで数値以外を記載できない様にする

こんな形で構成してあげるとValidationを一緒に記載できるそうです。

まとめ

models.pyのカンマ、なんで気付かなかったのか…。
Laravelのマイグレーションは行末に【;】を付けるから目が違和感を察知しなかったんだろうなぁ。

反省です。