【Django】ForeignKeyでモデルのインポートをしない 文字列でモデルを指定する方法 NameError への対処法

※本サイトにはプロモーション・広告が含まれています。

Djangoのモデルフィールド「ForeignKey」を設定する際に

他ファイルからインポートをしないでモデルを指定したい

もしくは、

NameError: name 'ModelName' is not defined

が出てきてしまう

そんな時のモデルの指定方法をご説明します

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

ズバリ、解決策!

実例からご紹介

class Lead(models.Model):
    ....
    ....
    person = models.ForeignKey("leads.Person", on_delete=models.CASCADE, default=1, verbose_name="担当者名")
    ....

上記の「person」というフィールドではモデルを文字列で指定しています

構造の解説

上記の例をいればもう分かったという方もいらっしゃると思いますが、下記の通り記述すればstr型(文字列)で指定可能です

<フィールド名> = models.ForeignKey("<apps.py内のname>.<モデルクラス名>")

通常は、

from leads.models import Person

class Lead(models.Model):
    ....
    ....
    person = models.ForeignKey(Person, on_delete=models.CASCADE, default=1, verbose_name="担当者名")
    ....

というように、対象のモデルをインポートした上で使用する形はよく見ることと思います

ただこの場合、モデル数が増えてきたりした場合にimportの関係がとても複雑になってくるためうまく機能しない場合が多いです

そんなときにこちらの文字列型で指定する方法をうまく活用して下さい

以上、モデルのインポートなくForeignKeyにモデルを指定する方法、のご説明でした

最後までお読み頂きありがとうございました!!!

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