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

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

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

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

もしくは、

NameError: name 'ModelName' is not defined

が出てきてしまう

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

筆者プロフィール

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

【現職】プロマネ/システムプランニング(元外資系金融機関営業)

【副業】ブログ(月間12万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をコピーしました