DjangoでPylanceがimportを解決しない問題の対処法

TL; DR

Pylanceは非常に優れたコーディング支援拡張機能ですが、importがよく解決されなくて困っていました。小規模開発のときはまあいいか、と思ったりするのですが、djangoとかで解決されないと結構手間なので、解決法を調べたら解決したので書いておきます。

状況

ディレクトリ構成

appが増えてくると、分割したくなります。よく作るのはこんな感じです。

app
├── app1
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── app2
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── config
│   ├── __init__.py
|   ...
└── manage.py

問題点

app1で定義したモデルをapp2で使いたい、ということがよくあります。

例えば、app2view.pyapp1のモデルを使いたいとします。

単純には、こうすればいいです。

from app1 import models

しかし、これだとPylanceの補完が効かずImport "app1" could not be resolvedという警告が表示されます。

じゃあ相対インポートにすれば解決するかな、と考えます。

from ..app1 import models

Pylanceは警告を出さなくなります。補完も効きます。

しかし、いざdjangoを起動させようとするとValueError: attempted relative import beyond top-level packageが起こります。

sys.pathを使う方法もありますが、毎回書くのは嫌です。

解決策

コード側で解決する方法は調べてもわかりませんでした。そこで、Pylance側の設定をどうにかすることで強引な解決を図りました。Pylanceのトラブルシューティングを読むと、Unresolved import waningsという項目があります。

これによると.vscode/settings.jsonpython.analysis.extraPathsを設定すればいいらしいです。

以下のような設定を作成します。

".vscode/settings.json"

{
    "python.analysis.extraPaths": ["./app"]
}

もう一度

from app1 import models

を試してみると、今度は警告が表示されず、補完も効くようになりました。

この記事に関するIssueをGithubで作成する

Read Next