【Django】shell_plusを使いこなすデバッグ術

Django

こんにちは、かつコーチです。

Djangoには標準でpython manage.py shellというコマンドがありますが、実際に使ってみると「モデルを毎回importするのが面倒」と感じたことはないでしょうか。
筆者もこの手間が地味にストレスで、調べているうちにshell_plusという便利なコマンドの存在を知りました。

この記事では、django-extensionsが提供するshell_plusを使って、モデルのデータ確認やちょっとしたロジックの検証を効率化する方法を紹介します。

shell_plusとは何か

標準のshellとの違い

Django標準のshellコマンドは、Pythonの対話環境からDjangoのモデルなどを操作できる機能です。
ただし、モデルを使うには毎回自分でimport文を書く必要があります。

python manage.py shell
>>> from blog.models import Post
>>> from accounts.models import User

shell_plusは、django-extensionsというライブラリが提供する拡張コマンドで、プロジェクト内の全モデルを自動でimportした状態で対話環境を起動してくれます。

django-extensionsの導入

pip install django-extensions

settings.pyINSTALLED_APPSに追加します。

INSTALLED_APPS = [
    ...
    "django_extensions",
]

これだけで、shell_plusコマンドが使えるようになります。

基本の使い方

モデルをimportなしで操作する

python manage.py shell_plus

起動すると、起動時に自動importされたモデル一覧が表示されます。

# Shell Plus Model Imports
from blog.models import Post, Category
from accounts.models import User
...

あとはimport不要で、そのままモデルを操作できます。

>>> Post.objects.filter(is_published=True).count()
12
>>> Post.objects.last()
<Post: 初めてのDjango投稿>

実行されたSQLを確認する(–print-sqlオプション)

デバッグでとくに便利なのが、発行されたSQLをそのまま表示するオプションです。

python manage.py shell_plus --print-sql
>>> Post.objects.filter(category__name="Django").count()
SELECT COUNT(*) AS "__count"
FROM "blog_post"
INNER JOIN "blog_category" ON ("blog_post"."category_id" = "blog_category"."id")
WHERE "blog_category"."name" = 'Django'

Execution time: 0.001230s [Database: default]

「思ったより遅いクエリだな」と感じたとき、まずこのオプションで実際のSQLを確認する癖をつけると、N+1問題などにも早い段階で気づけるようになります。

よくあるつまずきポイント・エラー対処

shell_plusコマンドが見つからない

❌Before

$ python manage.py shell_plus
Unknown command: 'shell_plus'
Type 'manage.py help' for usage.

筆者もインストール直後にこのエラーに遭遇し、「pip installしたのに動かない」としばらく戸惑いました。
原因は、pip installしただけでINSTALLED_APPSへの追加を忘れていたことです。

✅After

# settings.py
INSTALLED_APPS = [
    ...
    "django_extensions",  # これを追加する
]

Djangoの管理コマンドは、INSTALLED_APPSに登録されたアプリの中から探索される仕組みになっています。
pip install(パッケージのインストール)とINSTALLED_APPSへの登録(Djangoへの認識)は別の作業だと意識しておきましょう。

IPythonが入っていないと素っ気ない画面になる

shell_plusIPythonがインストールされていると、補完機能や見やすい表示など、より快適な対話環境になります。
入っていない場合は標準のPythonシェル相当の表示になるだけでエラーにはなりませんが、開発体験を上げたいなら合わせてインストールしておくのがおすすめです。

pip install ipython

応用・一歩先の使い方

notebook形式でも使える

shell_plus --notebookとすると、Jupyter Notebook形式でモデルを操作できます。
グラフ化やデータの可視化を交えて調査したいときに便利です。

pip install jupyter
python manage.py shell_plus --notebook

本番データを直接触るときは慎重に

shell_plusは非常に便利な反面、本番環境で不用意に使うと、うっかりdelete()update()を実行してデータを壊してしまうリスクもあります。
本番のデータ調査をする際は、まず--print-sqlで実行内容を確認したり、トランザクションを意識したりするなど、慎重な運用を心がけましょう。

まとめ

この記事のポイント

  • shell_plusdjango-extensionsが提供する、モデル自動importつきの対話シェル
  • INSTALLED_APPSへの追加を忘れるとUnknown commandエラーになる
  • --print-sqlオプションで実行SQLを確認でき、クエリの無駄な発行に気づきやすい
  • 本番データを触る際はうっかり操作に注意する

次に読むべき記事

クエリの効率化についてさらに深掘りしたい方は、「N+1問題とselect_related・prefetch_relatedでの解決方法」もあわせてご覧ください。

タグ: Django, 初心者向け, エラー解決

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