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

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

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

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

もしくは、

NameError: name 'ModelName' is not defined

が出てきてしまう

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

運営者プロフィール

運営者プロフィールアイコン

現在はIT企業のプロダクトマネージャーとして、個人向け/社内向けシステムなど、複数のシステム開発・運営に携わっています。

Webサイト構築やECサイトの開発経験に加えて、PythonなどのプログラミングやSalesforceなどのクラウドアプリケーションに関する幅広い知識・経験を活かして「プログラミング初心者がスムーズに学べるサイト」を目指しています。

Githubでは、趣味で作成したアプリなどを公開しています。

https://github.com/Yulikepython/

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

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

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

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

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

ズバリ、解決策!

実例からご紹介

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をコピーしました